题意:给你n个物品,每个物品有价值和数量,让你尽量平分总价格,第一个数要大于第二个
思路:做出类似的,从中间开始01背包
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
const int MAXN = 110;
int n,sum,a[MAXN<<3];
int f[300010];
int num;
int main(){
while (scanf("%d",&n) != EOF && n > 0){
num = 0,sum = 0;
for (int i = 1; i <= n; i++){
int val,m;
scanf("%d%d",&val,&m);
sum += val * m;
for (int j = 1; j <= m; j++)
a[++num] = val;
}
int dir = sum / 2;
memset(f,0,sizeof(f));
for (int i = 1; i <= num; i++)
for (int j = dir; j >= a[i]; j--)
f[j] = max(f[j],f[j-a[i]]+a[i]);
printf("%d %d\n",sum-f[dir],f[dir]);
}
return 0;
}HDU - 1171 Big Event in HDU,布布扣,bubuko.com
原文:http://blog.csdn.net/u011345136/article/details/21022765