个人觉得,这个可以作为多重背包的模板使用,其中包括了简单的0-1背包和完全背包,分清楚它们三个的区别。。。
#include<stdio.h>
#include<stdlib.h>
#define N 60005
#define MAX(a,b) (a>b?a:b)
int c[N];
void Complete(int cost, int weight, int m) // 完全背包, 顺序
{
int i;
for(i=cost;i<=m;i++)
c[i]=MAX(c[i],c[i-cost]+weight);
}
void Zero_One(int cost, int weight, int m) // 0-1背包, 逆序
{
int i;
for(i=m;i>=cost;i--)
c[i]=MAX(c[i],c[i-cost]+weight);
}
int main()
{
int cas=1,i,j,k,sum,t,n1,n2,flag[2],a[20005];
while(scanf("%d%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6])!=EOF)
{
sum=0;
for(i=1;i<=6;i++)
sum+=i*a[i];
if(sum==0) break;
printf("Collection #%d:\n",cas++);
if(sum%2!=0) printf("Can't be divided.\n");
else{
memset(c,0,sizeof(c));
sum/=2;
for(i=1;i<=6;i++)
{
t=i*a[i]; // 价值为i的珠宝的总价值
if(t>sum) Complete(i,i,sum);
else
{
k=1; // 价值为i的珠宝的个数
while(k<a[i])
{
Zero_One(k*i,k*i,sum);
a[i]-=k;
k*=2;
}
Zero_One(a[i]*i,a[i]*i,sum);
}
}
if(c[sum]==sum) printf("Can be divided.\n");
else printf("Can't be divided.\n");
}
printf("\n");
}
system("pauese");
return 0;
}