http://acm.hdu.edu.cn/showproblem.php?pid=1171
这道题咋看有点复杂,其实也只是换了一种思维,因为题目要求要尽量平均分配,所以我们可以先将总价值sum求出,然后得出其分配的平均值为sum/2,要注意这个答案可能为小数,但是又因为sum是整数,所以最后得出的sum/2是要小于等于实际的值。将这个结果进行01,背包,可以得出其中一个宿舍所得的最大价值,而另一个宿舍的最大价值也可以相应的得到,而前者必定小于等于后者。
include<iostream>
include<cstring>
include<algorithm>
define INF 1000005
using namespace std;
int d[1005][1005];
int v[5005];
int main(){
int n;
while(cin >> n,n>0) {
int sum = 0;
for(int i = 1,k = 0;k < n;k++)
{
int e,f;
cin >> e >> f;
sum += e*f;
while(f--)
v[i++] = e;
}
for(int i = 1;i <= n;i++)
{
for(int j = 0;j <= sum/2;j++){
d[i][j] = (i == 1?0:d[i-1][j]);
if(j >= v[i])
d[i][j] = max(d[i][j],d[i-1][j-v[i]]+v[i]);
}
}
cout << sum - d[n][sum/2] << " " << d[n][sum/2] << endl;
memset(d,0,sizeof(d));
}
return 0;
}