http://acm.hdu.edu.cn/showproblem.php?pid=1171
一道水题,用来熟悉一下母函数;
多重背包:
#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;}
母函数:
#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;}