《动态规划》hdoj acm 3.3.3 多重背包

#include<stdio.h>
#include<string.h>
int w[55000]; int f[20005]; int max(int x,int y) { return x>y?x:y; } int main() { int sum,i,j,n,x,t,c,number;
	number=0; while(scanf("%d",&c)) {
		number++; if(number!=1) {
			printf("\n"); }
		t=1;
		n=0;
		sum=c; while(c>=t) {
            w[++n]=t;
			c-=t;
			t*=2; } if(c) {
			w[++n]=c; } for(i=2;i<=6;i++) {
			scanf("%d",&c);
			t=1;
			sum+=i*c; while(c>=t) {
				w[++n]=t*i;
				c-=t;
				t*=2; } if(c) {
			    w[++n]=c*i; } } if(!sum) break; if(sum%2==1) {
			printf("Collection #%d:\n",number);
			printf("Can't be divided.\n"); } else {
		    x=sum/2;
			memset(f,0,sizeof(f)); for(i=1;i<=n;i++) { for(j=x;j>=w[i];j--) {
					f[j]=max(f[j],f[j-w[i]]+w[i]); } } if(f[x]==x) {
				printf("Collection #%d:\n",number);
			    printf("Can be divided.\n"); } else {
                printf("Collection #%d:\n",number);
			    printf("Can't be divided.\n"); } } } return 0; }

你可能感兴趣的:(《动态规划》hdoj acm 3.3.3 多重背包)