[每日一题] [NC19158] 失衡天平

题目大意:将一组物品分成两组,每个物品都可以不出现在任何一组。希望两组的重量差异不超过M,最大化总重量。

https://ac.nowcoder.com/acm/problem/19158

基本就是一个背包问题的变体,对于前i个物品,差异为gap时的最大总重量进行dp即可。
转移为(i, gap) -> (i + 1, gap)和(i, gap) -> (i + 1, gap + wt[i + 1])和(i, gap) -> (i + 1, abs(gap - wt[i + 1]))。注意,gap的中间值是可以超过M的,需要给一个比较大的界,比如w1+...+wn。

#define MAXN 105
#define MAXW 20000
#define INF 20000
int N, M;
int wt[MAXN];
int dp[MAXN][MAXW];
int doit() {
  REP(i, N) {
    int w = wt[i];
    if (i == 0) {
      REP(j, MAXW) {
        dp[i][j] = -INF;
      }
      dp[i][0] = 0;
      dp[i][w] = w;
      continue;
    }
    REP(j, MAXW) {
      dp[i][j] = dp[i - 1][j];
    }
    REP(j, MAXW) {
      VI trans = {j + w, abs(j - w)};
      for (int t : trans) {
        if (0 <= t && t < MAXW) {
          dp[i][t] = max(dp[i][t], dp[i - 1][j] + w);
        }
      }
    }
  }
  int ans = 0;
  REP(j, M + 1) {
    ans = max(ans, dp[N - 1][j]);
  }
  return ans;
}
int main(int argc, char* argv[]) {
  read(N);read(M);
  read(wt, N);
  printint(doit());
  return 0;
}
全部评论

相关推荐

一个菜鸡罢了:哥们,感觉你的简历还是有点问题的,我提几点建议,看看能不能提供一点帮助 1. ”新余学院“别加粗,课程不清楚是否有必要写,感觉版面不如拿来写一下做过的事情,教育经历是你的弱势就尽量少写 2. “干部及社团经历”和“自我评价”删掉 3. 论文后面的“录用”和“小修”啥的都删掉,默认全录用,问了再说,反正小修毕业前肯定能发出来 4. 工作经验和研究成果没有体现你的个人贡献,着重包装一下个人贡献
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务