题目意思:
有5种硬币, 币值分别是 1, 5, 10, 25, 50。
题目给出 数n,求出由这5种硬币组成币值n, 有多少种选法。
本题要点:
1、状态表示:
dp[i][j]表示用j个硬币实现i金额的方案数
2、状态转移方程:
for(int k = type[i]; k < MONEY; ++k) //5种硬币
{
dp[k][j] += dp[k - type[i]][j - 1];
}
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int MONEY = 251, COIN = 101;
int dp[MONEY][COIN]; //dp[i][j]表示用j个硬币实现i金额的方案数
int s;
int type[6] = {0, 1, 5, 10, 25, 50};
int ans[MONEY];
void solve()
{
memset(dp, 0, sizeof dp);
dp[0][0] = 1;
for(int i = 1; i <= 5; ++i)
{
for(int j = 1; j < COIN; ++j)
{
for(int k = type[i]; k < MONEY; ++k) //5种硬币
{
dp[k][j] += dp[k - type[i]][j - 1];
}
}
}
}
int main()
{
solve();
for(int i = 0; i < MONEY; ++i)
for(int j = 0; j < COIN; ++j)
{
ans[i] += dp[i][j];
}
while(scanf("%d", &s) != EOF)
{
printf("%d\n", ans[s]);
}
return 0;
}
/*
11
26
*/
/*
4
13
*/