有1分,2分,3分硬币,将钱N分 (N<32768) 兑换成硬币有很多种兑法。请你编程序计算出共有多少种兑法。
时间: 2024-12-15 19:13:49 浏览: 1
这是一个经典的动态规划问题,通常称为“零钱兑换”或“改变找零”的变种。你可以使用一个数组`dp`来存储每个金额下的硬币组合数,其中`dp[i]`表示用一分、两分和三分硬币组成i分的方法数。
算法步骤如下:
1. 初始化:`dp[0] = 1`,因为没有硬币时只有一种方法(即不换)。
2. 遍历:对于每个金额`i`从1到`N`,检查是否可以用一枚硬币达到这个金额,如果可以,则增加`dp[i]`为`dp[i-1] + dp[i-2] + dp[i-3]`,分别对应于不用硬币、用一枚一分硬币和用一枚二分硬币的情况。
3. 最后,`dp[N]`就是所有可能的兑换方法数。
下面是C++代码实现:
```cpp
#include <vector>
int change(int n, int coins[] = {1, 2, 3}) {
std::vector<int> dp(n + 1, 0);
dp[0] = 1; // 基本情况:没有钱
for (int i = 1; i <= n; ++i) {
for (int coin : coins) {
if (coin <= i) {
dp[i] += dp[i - coin]; // 更新状态
}
}
}
return dp[n];
}
int main() {
int N;
std::cout << "Enter the total amount of money (N < 32768): ";
std::cin >> N;
std::cout << "Number of ways to make change: " << change(N) << std::endl;
return 0;
}
```
阅读全文