题目大意:有n种物品,每种物品的价格和数量已知,现在要求将这些物品分成两个集合,使两个集合的总价值的差最小。
这就是典型的多重背包问题。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//多重背包问题
int dp[250001],val[102],num[102];//dp一定要足够大
int main()
{
int n,i,j,k;
int sum;
while(scanf("%d",&n),n>0)
{
sum = 0;
for(i=0;i<n;i++)
{
scanf("%d%d",&val[i],&num[i]);
sum += num[i]*val[i];
}
int half = sum/2;
memset(dp,0,sizeof(dp));
dp[0] = 1;
for(i=0;i<n;i++)
{
for(j=0;j<num[i];j++)
{
for(k=half;k>=val[i];k--)
{
if(dp[k-val[i]]==1)
dp[k] = 1;
}
}
}
for(i = half;i>=0;i--)
{
if(dp[i]==1)
{
printf("%d %d\n",sum-i,i);
break;
}
}
}
system("pause");
return 0;
}