代码
#include <iostream>
#include <cstring>
using namespace std;
int dp[251][101];
int coin[5] = {1, 5, 10, 25, 50};
int main() {
memset(dp, 0, sizeof(dp));
dp[0][0] = 1;
for(int k=0; k<5; k++) { //当前最大面值是coin[k]
for(int i=1; i<=100; i++) { //硬币总数
for(int j=coin[k]; j<251; j++) { // j是总金额,当前最大面值为coin[k]时,总金额大于等于coin[k]的,数目都会发生变化
dp[j][i] += dp[j-coin[k]][i-1];
}
}
}
int n;
while(cin>>n) {
int sum = 0;
for(int i=0; i<101; i++) {
sum += dp[n][i];
}
cout<<sum<<endl;
}
return 0;
}
注解
1、dp[m][n]表示用n枚硬币组成金额为m的数目。
2、核心代码:三重循环,第一层是面额数,第二层是硬币个数,第三层是金额数。状态转移方程是:dp[j][i] += dp[j-coin[k]][i-1],其中i表示硬币数,j表示金额数,coin[k]表示面额。
for(int k=0; k<5; k++) { //当前最大面值是coin[k]
for(int i=1; i<=100; i++) { //硬币总数
for(int j=coin[k]; j<251; j++) { // j是总金额,当前最大面值为coin[k]时,总金额大于等于coin[k]的,数目都会发生变化
dp[j][i] += dp[j-coin[k]][i-1];
}
}
}
3、初始化:dp[0][0]=1。
4、memset初始化为0。