将一张100 元的钞票换成1 元、2元、5 元和10 元的零钱,每种零钞至少一张,编写程序输出所有的换法,尽可能地提高算法效率。(c++)
时间: 2024-10-25 22:17:10 浏览: 30
编一个程序,把一张面值100元的钞票换成5元,1元和5角面值的钞票,要求100元换以上的零钱100张,且要求每种不少于一张。请问,有哪几种换法?
5星 · 资源好评率100%
为了实现这个需求,你可以使用回溯算法(Backtracking)。下面是一个简单的C++程序示例,它会递归地遍历所有可能的组合,直到达到目标金额:
```cpp
#include <iostream>
#include <vector>
void change(int money, std::vector<int>& coins, int index = 0) {
if (money == 0) { // 找到一种完全匹配的组合
for (int coin : coins) {
std::cout << coin << " ";
}
std::cout << "\n";
return;
}
// 尝试将当前面值放入组合
if (index < coins.size() && money >= coins[index]) {
coins[index]++;
change(money - coins[index], coins, index);
coins[index]--;
}
// 如果当前面值不足以填充剩余金额,尝试下一个更大的面值
if (index + 1 < coins.size()) {
change(money, coins, index + 1);
}
}
int main() {
const int targetMoney = 100; // 目标金额100元
std::vector<int> coins = {1, 2, 5, 10}; // 零钞种类及面额
std::cout << "All possible combinations to change " << targetMoney << " into smaller coins:\n";
change(targetMoney, coins);
return 0;
}
```
在这个程序中,`change`函数接受当前剩余的金额、零钞列表以及遍历的索引。当找到可行的组合时,就打印出来。如果没有更多的零钞可以使用,就会回到上一级去尝试其他组合。
阅读全文