标签:software set size abs output val hdu 不同 process
2 10 1 20 1 3 10 1 20 2 30 1 -1Sample Output
20 10 40 40
多重背包问题,可以将问题转化成01背包。两种思路:将多个相同物品拆分成一个一个价值相同的不同物品;也可以在01背包递推时加一层物品个数的循环。
注意这题的坑点!是以一个负整数作为结束,不要想当然以为是-1。因为这个TLE了好久。。以后要认真读题
ps:negative integer负整数 positive integer正整数
//第一种写法,耗时1248ms #include<stdio.h> #include<string.h> int f[250005],a[10005]; int max(int x,int y) { return x>y?x:y; } int main() { int n,V,sum,c,x,y,i,j; while(scanf("%d",&n)&&n>=0){ memset(f,0,sizeof(f)); memset(a,0,sizeof(a)); sum=0;c=0; for(i=1;i<=n;i++){ scanf("%d%d",&x,&y); while(y--){ a[++c]=x; sum+=x; } } V=sum/2; for(i=1;i<=c;i++){ for(j=V;j>=a[i];j--){ f[j]=max(f[j],f[j-a[i]]+a[i]); } } printf("%d %d\n",sum-f[V],f[V]); } return 0; }
//第二种写法,耗时811ms #include<stdio.h> #include<string.h> int f[250005],a[1005],b[1005]; int max(int x,int y) { return x>y?x:y; } int main() { int n,V,sum,i,j,k; while(scanf("%d",&n)&&n>=0){ memset(f,0,sizeof(f)); memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); sum=0; for(i=1;i<=n;i++){ scanf("%d%d",&a[i],&b[i]); sum+=a[i]*b[i]; } V=sum/2; for(i=1;i<=n;i++){ for(k=1;k<=b[i];k++){ for(j=V;j>=0;j--){ if(j-a[i]>=0){ f[j]=max(f[j],f[j-a[i]]+a[i]); } } } } printf("%d %d\n",sum-f[V],f[V]); } return 0; }
标签:software set size abs output val hdu 不同 process
原文地址:http://www.cnblogs.com/yzm10/p/7357204.html