题意:
给出n物品,每个物品有两个参数,价值v,数目m 求,将这些物品分成两份,这两份的价值差值最小。
母函数求解,注意初始化的不同
#include<stdio.h> #include<string.h> int v[55],num[55]; int a[300000],b[200000]; int main() { int n,i,j,k; while(scanf("%d",&n)!=EOF) { if(n<0)break; int sum=0; for(i=1;i<=n;i++) { scanf("%d%d",&v[i],&num[i]); sum+=v[i]*num[i]; } int d=(sum+1)/2; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); for(i=0;i<=num[1]*v[1];i+=v[1]) { a[i]=1; } int h=num[1]*v[1]; for(i=2;i<=n;i++) { for(j=0;j<=h;j++) { for(k=0;k<=num[i]*v[i];k+=v[i]) { b[k+j]+=a[j]; } } h+=num[i]*v[i]; for(j=0;j<=h;j++) { a[j]=b[j]; b[j]=0; } } if(a[d]!=0) { printf("%d %d\n",d,sum-d); } else { for(i=d;i<=sum;i++) { if(a[i]!=0)break; } printf("%d %d\n",i,sum-i); } } }