Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 60332 | Accepted: 15567 |
Description
Input
Output
Sample Input
1 0 1 2 0 0 1 0 0 0 1 1 0 0 0 0 0 0
Sample Output
Collection #1: Can't be divided. Collection #2: Can be divided.
Source
#include <map> #include <set> #include <list> #include <stack> #include <vector> #include <queue> #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int dp[720010]; int w[8]; int num[8]; int v; void zero_one(int weight) { for (int i = v; i >= weight; i--) { dp[i] = max(dp[i], dp[i - weight] + weight); } } void wanquan(int weight) { for (int i = weight; i <= v; i++) { dp[i] = max(dp[i], dp[i - weight] + weight); } } void duochon(int amount, int weight) { if (amount * weight >= v) { wanquan(weight); return; } int k = 1; while(k < amount) { zero_one(k * weight); amount -= k; k <<= 1; } zero_one(amount * weight); } int main() { int n1, n2, n3, n4, n5, n6; int cnt; int icase = 1; while (~scanf("%d%d%d%d%d%d", &n1, &n2, &n3, &n4, &n5, &n6)) { cnt = 0; if (!n1 && !n2 && !n3 && !n4 && !n5 && !n6) { break; } v = 0; w[1] = 1; num[1] = n1; v += num[1]; w[2] = 2; num[2] = n2; v += num[2] * 2; w[3] = 3; num[3] = n3; v += num[3] * 3; w[4] = 4; num[4] = n4; v += num[4] * 4; w[5] = 5; num[5] = n5; v += num[5] * 5; w[6] = 6; num[6] = n6; v += num[6] * 6; printf("Collection #%d:\n", icase++); if (v & 1) { printf("Can't be divided.\n"); printf("\n"); continue; } v >>= 1; memset (dp, 0, sizeof(dp) ); dp[0] = 0; for (int i = 1; i <= 6; ++i) { duochon(num[i], w[i]); } if (dp[v] != v) { printf("Can't be divided.\n"); } else { printf("Can be divided.\n"); } printf("\n"); } }