时间:2016-05-11 15:37:21 星期三
题目编号:[2016-05-11][51nod][1007 正整数分组]
题目大意:将一堆正整数分为2组,要求2组的和相差最小。
分析:分成组,两组之和越接近总和的一半,差值越小
- 题目就变成了,把体积为ai,价值也为ai的物品i,放入容积为 sum / 2的背包中,问最多能放多少
- 得到的最大值,就是其中一组的和,由此可以算出答案
#include<stdio.h>#include<math.h>#include<algorithm>using namespace std;const int maxn = 1E4 + 10;int a[maxn],dp[maxn];int main(){ int n,sum = 0; scanf("%d",&n); for(int i = 0 ; i < n ; ++i){ scanf("%d",&a[i]); sum += a[i]; } for(int i = 0 ; i < n ; ++i){ for(int j = sum / 2 ; j >= a[i] ; --j){ dp[j] = max(dp[j] , dp[j - a[i]] + a[i]); } } printf("%d\n",abs(dp[sum / 2] - (sum - dp[sum / 2]))); return 0;}