(dp)正整数分组

来源:互联网 发布:网络带来的利与弊论文 编辑:程序博客网 时间:2024/06/05 15:14
(出处51nod)
将一堆正整数分为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)
输出
输出这个最小差
输入示例
512345
输出示例
1
----------------------------------------------------------------------------
分析:

用背包做,dp[i][j]代表前i个数字部分和为j

---------------------------------------------------------------------------------------------

AC代码: 

#include <iostream>#include<cstdio>using namespace std;int dp[110][10100];int a[110];int main(){    int b;    int n;    cin >> n;    int ans = 20000;    int res = 0;    for (int i=0; i<n; i++)    {        cin >> a[i];        res += a[i];    }    for (int i=0; i<=n; i++)    {        for (int j=0; j<res; j++)        {            if ((i == 0) && (j == 0))            {                dp[i][j] = 1;                continue;            }            if ((i == 0) && (j != 0))            {                dp[i][j] = 0;                continue;            }            if (a[i] > j)            {                dp[i][j] = 0;            }            if ((j >= a[i]) && (dp[i-1][j-a[i]]))            {                dp[i][j] = 1;            }            if (dp[i-1][j])            {                dp[i][j] = 1;            }        }    }        for (int j=0; j<res; j++)        {            if (dp[n][j])            {                b = res - j;                b = (j > b? j - b : b - j);                ans = min(ans, b);            }        }    cout << ans << endl;    return 0;}

原创粉丝点击