时间: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;
}