(3) 小明问阿凡提:“我有一张10元的钞票, 要兑换成1元、2元、5元的三种小票,要求兑换后每种面值至少一张, 有几种兑换方法? 分别怎样兑换? ”阿凡提算了半天也没给出答案, 请编写程序算一算。
时间: 2024-12-22 09:11:53 浏览: 7
要解决这个问题,我们可以创建一个动态规划的方法来计算不同组合的数量。我们定义一个二维数组 dp,其中 dp[i] 表示使用 i 元硬币能产生的组合数。对于每个金额 i(从1到10),我们尝试用1元、2元和5元的硬币进行组合。
```cpp
#include <iostream>
#include <vector>
int coinChange(int amount, std::vector<int>& coins) {
int n = coins.size();
std::vector<int> dp(amount + 1, 0);
dp[0] = 1; // 基本情况:没有钱,一种组合就是不兑换
for (int i = 1; i <= amount; ++i) {
for (int j = n - 1; j >= 0 && coins[j] <= i; --j) {
dp[i] += dp[i - coins[j]]; // 可以选择不换或用当前最小面额替换
}
}
return dp[amount] ? dp[amount] : -1; // 如果有解,则返回组合数量;无解则返回-1
}
int main() {
int amount = 10;
std::vector<int> coins = {1, 2, 5}; // 1元、2元和5元硬币
int result = coinChange(amount, coins);
if (result == -1) {
std::cout << "无法找到满足条件的组合。\n";
} else {
std::cout << "共有 " << result << " 种兑换方法。\n";
for (int i = 0; i < result; ++i) {
// 这里可以根据 dp 数组中的状态恢复具体的兑换方案,但这里略去具体代码
// 你可以添加一个递归或回溯算法来找出所有可能的组合
}
}
return 0;
}
```
在这个程序中,`coinChange` 函数会返回组合的数量,如果找不到满足条件的组合,则返回 -1。实际的兑换方案可以通过遍历 dp 数组并在适当的地方记录下来,但这超出了题目范围,所以这部分代码未在此处展开。
阅读全文