标签:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 65044 | Accepted: 16884 |
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
/* ID: LinKArftc PROG: 1014.cpp LANG: C++ */ #include <map> #include <set> #include <cmath> #include <stack> #include <queue> #include <vector> #include <cstdio> #include <string> #include <bitset> #include <utility> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define eps 1e-8 #define randin srand((unsigned int)time(NULL)) #define input freopen("input.txt","r",stdin) #define debug(s) cout << "s = " << s << endl; #define outstars cout << "*************" << endl; const double PI = acos(-1.0); const int inf = 0x3f3f3f3f; const int INF = 0x7fffffff; typedef long long ll; const int maxn = 200000; int dp[maxn]; int cnt[10]; int n, m; void pack01(int c, int v) { for (int i = m; i >= c; i --) { if (dp[i] < dp[i-c] + v) dp[i] = dp[i-c] + v; } } void packall(int c, int v) { for (int i = c; i <= m; i ++) { if (dp[i] < dp[i-c] + v) dp[i] = dp[i-c] + v; } } void packmult(int c, int v, int n) { if (c * n >= m) { packall(c, v); return ; } int k = 1; while (k <= n) { pack01(k * c, k * v); n = n - k; k *= 2; } pack01(n * c, n * v); } int main() { //input; int _t = 1; int tot; while (~scanf("%d %d %d %d %d %d", &cnt[0], &cnt[1], &cnt[2], &cnt[3], &cnt[4], &cnt[5])) { if (cnt[0] == 0 && cnt[1] == 0 && cnt[2] == 0 && cnt[3] == 0 && cnt[4] == 0 && cnt[5] == 0) break; memset(dp, 0, sizeof(dp)); printf("Collection #%d:\n", _t ++); tot = cnt[0] * 1 + cnt[1] * 2 + cnt[2] * 3 + cnt[3] * 4 + cnt[4] * 5 + cnt[5] * 6; if (tot % 2) { printf("Can‘t be divided.\n\n"); continue; } m = tot / 2; for (int i = 0; i < 6; i ++) { if (cnt[i]) packmult(i + 1, i + 1, cnt[i]); } if (m == dp[m]) printf("Can be divided.\n\n"); else printf("Can‘t be divided.\n\n"); } return 0; }
标签:
原文地址:http://www.cnblogs.com/LinKArftc/p/5024723.html