#include<bits/stdc++.h> usingnamespace std; // 传送门:https://vjudge.csgrandeur.cn/contest/507882#problem/E // 完全背包 // 快读不能和清缓存一起用! constint maxn = 100100; int t, e, f, n, m; // n为个数,m为背包大小 int cost[maxn], value[maxn], bag[maxn]; inlineintread() { int s = 0, w = 1; char ch = getchar(); while (ch < '0' || ch > '9') { if (ch == '-') w = -1; ch = getchar(); } while (ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar(); return s * w; } intmain() { t = read(); while (t--) { memset(bag, 0x3f, sizeof(bag)); e = read(), f = read(), n = read(); m = f - e; for (int i = 1; i <= n; i++) { value[i] = read(); cost[i] = read(); } bag[0] = 0; for (int i = 1; i <= n; i++) { int p = value[i]; int w = cost[i]; for (int j = w; j <= m; j++) { bag[j] = min(p + bag[j - w], bag[j]); } } if (bag[m] == 0x3f3f3f3f) cout << "This is impossible." << endl; else printf("The minimum amount of money in the piggy-bank is %d.\n", bag[m]); }
#include<bits/stdc++.h> usingnamespace std; // https://vjudge.csgrandeur.cn/contest/507882#problem/F // 多重背包优化 // 二进制优化 int cnt[601000]; int sum; int value[601000]; //此题不需要空间 int dp[601000]; inlineintread() { sum = 0; for (int i = 1; i <= 6; i++) cin >> cnt[i], sum += cnt[i] * i; return sum; } intmain() { ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); int flag = 0; while (read()) { memset(dp, 0, sizeof(dp)); memset(value, 0, sizeof(value)); printf("Collection #%d:\n", ++flag); if (sum % 2) { printf("Can't be divided.\n\n"); continue; } int num = 0; for (int i = 1; i <= 6; i++) { int remp = cnt[i]; int k = 1; //二进制个数 while (k <= remp) { num++; value[num] = i * k; remp -= k; k *= 2; } if (remp > 0) { num++; value[num] = i * remp; } } sum /= 2; for (int i = 1; i <= num; i++) for (int j = sum; j >= value[i]; j--) dp[j] = max(dp[j], dp[j - value[i]] + value[i]); //注意传进max内的两个参数 if (dp[sum] == sum) printf("Can be divided.\n\n"); else printf("Can't be divided.\n\n"); } return0; }