2018寒假做題心得
阿新 • • 發佈:2019-02-12
一個揹包問題,因為w == v 的特性,可以用01揹包解決,設定陣列cnt來記錄硬幣使用次數
依次執行初始化一次dp陣列,然後將所以硬幣遍歷一次,,先設定目標價格,再看這個價格是否可以達到(用下標表示價格)。
轉載自http://blog.csdn.net/u012762625/article/details/43485973;
裡面還有兩種更高階的解決辦法,有空再看看
#include <stdio.h> #include <string.h> int dp[100005], v[105],num[105], cnt[100005]; int main() { int n, m, i, j; while(scanf("%d%d", &n, &m) != EOF && n+m) { int ans = 0; memset(dp, 0, sizeof(dp)), dp[0] = 1; for (i = 0; i < n; i ++) { scanf("%d", v + i); } for (i = 0; i < n; i ++) { scanf("%d", num + i); } for (i = 0; i < n; i ++) { memset(cnt, 0, sizeof(cnt)); for (j = v[i]; j <= m; j ++) { if(dp[j-v[i]] == 1 && dp[j] == 0 && cnt[j-v[i]] < num[i]) { cnt[j] = cnt[j-v[i]] + 1; dp[j] = 1; ans ++; } } } printf("%d\n", ans); } return 0; }