題目大意:有5種硬幣, 面值分別為1、5、10、25、50,現在給出金額,問可以用多少種方式組成該面值。 解題思路:每種硬幣都有無限個,所以是典型的完全背包, 一開始寫的時候沒有考慮到面值的重復問題, 打表的時候將金額值逐一去計算, 但又使用到cnt[i] += cnt[i - sex[j]], 然後導致有些組成方式重復考慮進去(這種只適用50以內的, 不會造成面值的的重復考慮, 比如 100, 在sex[j] == 25時, cnt[100] += cnt[75], 但是75裡面的組成方式裡有可以用面值為50去組成的方案, 所以等下計算sex[j] == 50的時候就重復計算了) 正確的做法是cnt[i] += low(cnt[i - sex[j]]) 表示說cnt[i - sex[j]] 中用面值小於等於sex[j]的組成方式種類。寫法代碼中給出。
#include <stdio.h>
#include <string.h>
const int N = 7500;
const int sex[] = {1, 5, 10, 25, 50};
int n, cnt[N], t;
void Init() {
memset(cnt, 0, sizeof(cnt));
cnt[0] = 1;
for (int i = 0; i < 5; i++) {
for (int j = sex[i]; j < N; j++)
cnt[j] += cnt[j - sex[i]];
}
}
int main() {
Init();
while (scanf("%d", &n) == 1) {
printf("%d\n", cnt[n]);
}
return 0;
}