题意:价值为1,2,3,4,5,6. 分别有n[1],n[2],n[3],n[4],n[5],n[6]个。求能否找到满足价值刚好是所有的一半的方案。
思路:简单的多重背包,我建议多重背包都用二进制拆分优化下........
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; int dp[200000],w[200000]; int main() { int t[7],text=0; while(1) { int sum=0; for(int i=1;i<=6;i++) { scanf("%d",&t[i]); sum+=i*t[i]; } if(sum==0) break; printf("Collection #%d: ",++text); if(sum%2==1) { printf("Can't be divided. "); continue; } sum/=2; int cnt=0; for(int i=1;i<=6;i++) { int k=1; while(t[i]-k>0) { w[cnt++]=k*i; t[i]-=k; k*=2; } w[cnt++]=t[i]*i; } memset(dp,0,sizeof(dp)); for(int i=0;i<cnt;i++) { for(int j=sum;j>=w[i];j--) if(dp[j]<dp[j-w[i]]+w[i]) dp[j]=dp[j-w[i]]+w[i]; } if(dp[sum]==sum) printf("Can be divided. "); else printf("Can't be divided. "); printf(" "); } return 0; }