有六种大理石块,每种价值最大20000,按总价值进行平分
不需要按每种价值的大理石多大20000块进行平分,只需要对一个最低度的大理石数n(0<=n<=a[i])进行平分,其余部分可以直接平分,显然n是偶数
经过测试n=6;
#include<stdio.h> #include<string.h> int main() { int dp[130],i,j,a[7],v[50],k,sum,t=0; while(scanf("%d%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6]),a[1]||a[2]||a[3]||a[4]||a[5]||a[6]) { memset(dp,0,sizeof(dp)); k=0;sum=0;t++; for(i=1;i<=6;i++) { if(a[i]!=0&&a[i]%6==0) a[i]=6; else a[i]=a[i]%6; for(j=0;j<a[i];j++) { v[k++]=i;sum+=i; } } dp[0]=1; printf("Collection #%d:\n",t); if(sum%2==1){printf("Can't be divided.\n\n");continue;} for(i=0;i<k;i++) { for(j=sum;j>=v[i];j--) if(dp[j-v[i]]==1) dp[j]=1; } if(dp[sum/2]==1)printf("Can be divided.\n\n"); else printf("Can't be divided.\n\n"); } return 0;