贪心是错的,我试了起码6种贪心法,刚想出来的时候觉得很完美,但是最后所有贪心法都能找出反例。这是一道多重背包的问题。二进制优化也能过。
#include <iostream>
#include <cstdio>
#include <iomanip>
#include <string>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <map>
#include <algorithm>
#include <cmath>
#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define ull unsigned long long
#define uint unsigned int
#define l(x) x<<1
#define r(x) x<<1|1
#define ms(a,b) memset(a,b,sizeof(a))
using namespace std;
int sum,num,mul;
int dp[122222];
int marble[100];
int main() {
int t = 0;
while (++t) {
sum = 0;
ms(marble, 0);
ms(dp, 0);
for (int i = 0; i < 6; i++) {
cin >> marble[i];
sum += (i + 1)*marble[i];
}
if (sum == 0) break;
cout << "Collection #" << t << ":" << endl;
if (sum % 2 == 1) {
cout << "Can't be divided." << endl;
cout << endl;
continue;
}
else {
sum /= 2;
}
for (int i = 0; i < 6; i++) {
num = marble[i];
for (int k = 1; num > 0; k <<= 1) {
mul = min(k, num);
for (int j = sum; j >= (i + 1)*mul; j--) {
dp[j] = max(dp[j], dp[j - (i + 1)*mul] + (i + 1)*mul);
}
num -= mul;
}
}
if (dp[sum] == sum) {
cout << "Can be divided." << endl;
cout << endl;
}
else {
cout << "Can't be divided." << endl;
cout << endl;
}
}
return 0;
}