[每日一题] [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;
}
全部评论

相关推荐

10-09 00:50
已编辑
长江大学 算法工程师
不期而遇的夏天:1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
一颗宏心:华为HR晚上过了十二点后还给我法消息。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务