/* 又是一道多重背包的题目,其实我对于背包还是不懂,但是凭着记忆的动态方程 居然能打出可以AC的代码,还奇怪的 */ #include <iostream>//00451533 2010-07-10 18:40:39 Accepted 1005 15 MS 412 KB Visual C++ 悔惜晟 #include <cstdio> #include <cstring> using namespace std; const int N = 60005; int main() { int kind[7]; int t = 1; while(1) { int sum = 0; int val = 0; for(int i = 1; i <= 6; i++) { scanf("%d", &kind[i]); kind[i] %= 10;// 这句话没有加就TLE val += i * kind[i]; sum += kind[i]; } if(sum == 0) break; if(val / 2 != val - val / 2) { printf("Collection #%d:/n", t++); printf("Can't be divided./n/n"); continue; } int dp[N]; memset(dp, 0, sizeof(dp)); for(int i = 1; i <= 6; i++) for(int j = 1; j <= kind[i]; j++) for(int k = val / 2; k >= i; k--) dp[k] = max(dp[k], dp[k - i] + i); if(dp[val / 2] == val - val / 2) { printf("Collection #%d:/n", t++); printf("Can be divided./n/n"); } else { printf("Collection #%d:/n", t++); printf("Can't be divided./n/n"); } } }