地址:http://acm.bit.edu.cn/mod/programming/view.php?id=665
题意:有N种东西,每种东西有价值和数量。要把所有东西分成尽量平均的两份。
一眼看出是价值和重量相等的多重背包。。背包容量是总价值/2。。久违的1Y
#include<iostream>
int v[55],a[55],dp[255555];
int main()
{
int n,i,j,k,sum,max;
while(~scanf("%d",&n))
{
sum=0;
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
{
scanf("%d%d",&v[i],&a[i]);
sum+=v[i]*a[i];
}
for(k=1;k<=n;k++)
{
for(i=sum/2;i>=0;i--)
{
max=-1;
for(j=0;j<=a[k];j++)
{
if(i-j*v[k]>=0)
{
if(dp[i-j*v[k]]+j*v[k]>max) max=dp[i-j*v[k]]+j*v[k];
}
else break;
}
dp[i]=max;
}
}
printf("%d %d\n",sum-dp[sum/2],dp[sum/2]);
}
return 0;
}