此题把总价值的一半作为背包容量,背包的数量要把所以数量都算上,这样就是简单的0-1背包问题了,价值作为容量和价值,求出的最大价值便是B
总价值-B=A;这个的结束标识n>0.
代码:
#include<stdio.h>
#include<string.h>
int dp[125051],val[5050]; //种类*价值*数量/2 最大125000
int Max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int maxv,i,j,n,m,a,k,maxt;
while(scanf("%d",&n)!=EOF && n>0)
{
memset(val,0,sizeof(val));
maxv=0;
k=0;
for(i=0;i<n;i++)
{
scanf("%d%d",&a,&m);
for(j=0;j<m;j++)
{
val[k]=a;
k++;
}
maxv+=(a*m);
}
memset(dp,0,sizeof(dp));
maxt=maxv/2;
for(i=0;i<k;i++)
{
for(j=maxt;j>=val[i];j--)
dp[j]=Max(dp[j-val[i]]+val[i],dp[j]);
}
printf("%d %d\n",maxv-dp[maxt],dp[maxt]);
}
return 0;
}