HDU-2844-Coins
阿新 • • 發佈:2019-03-04
clas mem pro ace 思路 ble nbsp inf vector
鏈接:https://vjudge.net/problem/HDU-2844#author=CCOA
題意:
給定幾種不同面額的硬幣若幹枚,需要求的用這些硬幣可以組成多少種範圍在1~m的不同面額的組合。
思路:
多重背包,二進制優化。
代碼:
#include <iostream> #include <memory.h> #include <vector> #include <map> #include <algorithm> #include <cstdio> #include <math.h> using namespace std; typedef long long LL; const int MAXN = 1e2 + 10; const int MAXM = 1e5 + 10; const int INF = 1e9; int dp[MAXM]; int a[MAXN], b[MAXN]; int main() { int n, m; while (scanf("%d %d", &n, &m), n|m) { memset(dp, 0, sizeof(dp)); for (int i = 1;i <= n;i++) scanf("%d", &a[i]); for (int i = 1;i <= n;i++) scanf("%d", &b[i]); for (int i = 1;i <= n;i++) { int k = 1; int v; while (k <= b[i]) { v = k * a[i]; b[i] -= k; for (int j = m;j >= v;j--) dp[j] = max(dp[j], dp[j - v] + v); k = k << 1; } if (b[i] > 0) { k = b[i]; v = k * a[i]; for (int j = m;j >= v;j--) dp[j] = max(dp[j], dp[j - v] + v); } } int res = 0; for (int i = 1;i <= m;i++) if (dp[i] == i) res++; printf("%d\n", res); } return 0; }
HDU-2844-Coins