首页 > 其他 > 详细

51 nod | 1007 正整数分组(背包DP)

时间:2021-04-01 22:57:36      阅读:14      评论:0      收藏:0      [点我收藏+]

补题链接:Here

将一堆正整数分为2组,要求2组的和相差最小。

例如:1 2 3 4 5,将1 2 4分为1组,3 5分为1组,两组和相差1,是所有方案中相差最少的。

输入

第1行:一个数N,N为正整数的数量。
第2 - N+1行,N个正整数。
(N <= 100, 所有正整数的和 <= 10000)

输出

输出这个最小差

由于是需要分为两堆,所以可以先统计数组和,然后两堆的总和尽量靠近 sum / 2

换言之这是一道背包DP

AC 代码

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int dp[100001];
int a[101];
int main() {
    int n, s = 0;
    cin >> n;
    for (int i = 1; i <= n; ++i) {
        cin >> a[i];
        s += a[i];
    }
    int m = (s + 1) / 2;
    for (int i = 1; i <= n; ++i)
        for (int j = m; j >= a[i]; --j)
            dp[j] = max(dp[j - a[i]] + a[i], dp[j]);
    cout << abs(s - dp[m] * 2);
    return 0;
}

51 nod | 1007 正整数分组(背包DP)

原文:https://www.cnblogs.com/RioTian/p/14608201.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!