hdu 1171 Big Event in HDU
http://acm.hdu.edu.cn/showproblem.php?pid=1171
一道水题,用来熟悉一下母函数;
多重背包:
View Code
#include<iostream>
#include<cstdio>
using namespace std;
int value[55],num[55],ans[250010];
int main()
{
int n,sum,w,i,j,k;
while(scanf("%d",&n),n>0)
{
sum=0;
for(i=1;i<=n;i++)
{
scanf("%d%d",&value[i],&num[i]);
sum+=value[i]*num[i];
}
w=sum;
sum/=2;
for(i=0;i<=sum;i++)
ans[i]=0;
ans[0]=1;
for(i=1;i<=n;i++)
for(j=1;j<=num[i];j++)
for(k=sum;k>=value[i];k--)
if(ans[k-value[i]])
ans[k]=1;
for(i=sum;i>=0;i--)
if(ans[i])
break;
printf("%d %d\n",w-i,i);
}
return 0;
}
母函数:
View Code
#include<cstdio>
using namespace std;
int ans[250010];
int value[55],num[55],n;
int main()
{
int sum,w,i,j,k,s;
while(scanf("%d",&n),n>0)
{
sum=0;
for(i=1;i<=n;i++)
{
scanf("%d%d",&value[i],&num[i]);
sum+=value[i]*num[i];
}
w=sum/2;
for(i=0;i<=sum;i++)
ans[i]=0;
ans[0]=1;
for(i=1;i<=num[1];i++)
ans[i*value[1]]=1;
for(i=2;i<=n;i++)
{
for(j=0;j<=w;j++)
for(k=0,s=0;k+j<=w&&s<=num[i];k+=value[i],s++)
if(ans[j])
ans[j+k]=1;
}
for(i=w;i>=0;i--)
if(ans[i])
break;
printf("%d %d\n",sum-i,i);
}
return 0;
}