动态规划,和pku1276的算法是基本一样的 显然,如果总价值为奇数,则均分是不可能的,如果总价值为偶数,则看各种marble的线性组合值能否为总价值的一半,如果可能,则可均分 #include <iostream> using namespace std; /* #include <fstream> ifstream fin("data.txt"); #define cin fin */ int mars[7]; bool flag[120002]; int main() { int i, j, k, sum, cno=0, end; while (cin>>mars[1]>>mars[2]>>mars[3]>>mars[4]>>mars[5]>>mars[6] && (mars[1]+mars[2]+mars[3]+mars[4]+mars[5]+mars[6])) { for (sum=0, i=1; i<7; i++) sum += i*mars[i]; cno++; if (sum%2) { cout << "Collection #" << cno << ":/nCan't be divided." << endl << endl; continue; } memset(flag, 0, sizeof(flag)); flag[0] = true; end = 0; for (i=1; i<7; i++) { for (j=end; j>=0; j--) //逆序更新 { if (flag[j]) { for (k=1; k<=mars[i]; k++) { if (j+k*i>sum/2 || flag[j+k*i]) //剪枝 break; flag[j+k*i] = true; } } } end += i*mars[i]; if (end > sum/2) end = sum/2; } if (!flag[sum/2]) cout << "Collection #" << cno << ":/nCan't be divided." << endl << endl; else cout << "Collection #" << cno << ":/nCan be divided." << endl << endl; } return 0; }