题意:有五种无限个数面的硬币,求有多少种方法凑成面值N。
d[i][j] = 前i个硬币,金额为j的分发。先求出coin[0](即1便士)的总的分发,在求出coin[1]的总的分发,加上d[i-1][j],一层层叠加,最后答案便是:d[4][n]。
可以空间压缩至1维。可打表输出。
d[j] += d[j-coin[i]];#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int MAX_N = 7500, INF = 0x3f3f3f3f; int N; int coin[5] = {1, 5, 10, 25, 50}, d[MAX_N]; int main() { //freopen("in.txt", "r", stdin); memset(d, 0, sizeof(d)); d[0] = 1; for(int i = 0; i < 5; i++) for(int j = coin[i]; j <= MAX_N; j++) d[j] += d[j-coin[i]]; while(scanf("%d", &N) != EOF) { printf("%d\n", d[N]); } return 0; }