题目链接: 点击打开链接
题目大意: 给定一个面额,求将这个面额换算成硬币的方案数。
思路: 动态规划,完全背包
分析:
完全背包基础题,用一维数组dp[j]存放当面额为j时的方案数,状态转移方程可以这么理解:dp[i][j] = dp[i-1][j] + dp[i][j - coins[p]]。
代码:
#include <cstdio>
#include <memory.h>
using namespace std;
const int maxc = 8000;
int coins[5] = {1, 5, 10, 25, 50};
int cents, dp[maxc];
void solve()
{
memset(dp, 0, sizeof(dp));
dp[0] = 1;
for (int i = 0; i < 5; ++i)
for (int j = coins[i]; j <= cents; ++j)
dp[j] += dp[j - coins[i]];
}
int main()
{
while (scanf("%d", &s) == 1)
{
solve();
printf("%d\n", dp[cents]);
}
}