题意:给你一些硬币,求出分成两堆,使得两堆的差最小,求出差。
用dp[]表示能否分到这么多钱,由于一种分法就是一堆空一堆总和,所以dp[0]一定为true,然后的思想就是如果dp[j - coin[i]]可以分到,那dp[j]肯定能分到。
代码:
/*
* Author: illuz <iilluzen[at]gmail.com>
* Blog: http://blog.csdn.net/hcbbt
* File: 562.cpp
* Create Date: 2013-09-21 20:24:49
* Descripton: dp
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 101000;
int a[MAXN];
bool dp[MAXN];
int main() {
int t, n, sum;
scanf("%d", &t);
while (t--) {
memset(dp, 0, sizeof(dp));
sum = 0;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
sum += a[i];
}
dp[0] = 1;
for (int i = 0; i < n; i++)
for (int j = sum; j >= a[i]; j--)
if (dp[j - a[i]])
dp[j] = 1;
for (int i = sum / 2; i >= 0; i++)
if (dp[i]) {
printf("%d\n", abs(sum - 2 * i));
break;
}
}
return 0;
}