(出处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)
输出
输出这个最小差
输入示例
5
1
2
3
4
5
输出示例
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;
}