#include <stdio.h>
#include <string.h>
int c[55],w[55],f[150005];
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n<0)
break;
int s=0,i,j,k,m;
for(i=0;i<n;i++)
{
scanf("%d%d",&c[i],&w[i]);
s+=c[i]*w[i];
}
m=s/2;
memset(f,0,sizeof(f));
for(i=0;i<n;i++)
{
for(k=1;k<w[i];k=k*2)
{
for(j=m;j>=c[i]*k;j--)
f[j]=max(f[j-c[i]*k]+c[i]*k,f[j]);
w[i]=w[i]-k;
}
for(j=m;j>=c[i]*w[i];j--)
f[j]=max(f[j-c[i]*w[i]]+c[i]*w[i],f[j]);
}
printf("%d %d\n",s-f[m],f[m]);
}
return 0;
}
对总价值的一半进行背包,求出接近一半的值
hdu 1171 Big Event in HDU 多重背包基础题
最新推荐文章于 2018-08-15 09:21:32 发布