编译器:C++ (g++) 编写一个C++风格的程序,解决百钱问题:将一元人民币兑换成1、2、5分的硬币,有多少种换法? 输入格式: 输出格式: 输出换法的种数 输入样例: 在这里给出一组输入。例如: 输出样例: 在这里给出相应的输出。例如: 100
时间: 2024-09-12 14:08:22 浏览: 48
在C++中,我们可以使用递归的方式来解决这个“百钱问题”。这个问题可以理解为计算给定金额(如100分)可以用多少种组合方式由1分、2分和5分的硬币组成。下面是一个简单的解决方案:
```cpp
#include <iostream>
// 定义函数,用于计算总金额的换法数目
int change(int amount, int coins[3], int count) {
// 如果金额为0,则找到了一种换法
if (amount == 0)
return 1;
// 对于每种硬币,考虑是否使用
for (int i = 0; i <= count; ++i) {
// 如果当前硬币不足以支付剩余金额,跳过这次尝试
if (coins[i] > amount)
continue;
// 使用当前硬币,然后递归地计算剩下的金额
int remainingAmount = amount - coins[i];
int res = change(remainingAmount, coins, i); // 更新结果
// 返回当前状态的结果加上剩余状态的结果
result += res;
}
return result;
}
int main() {
int n = 100; // 需要兑换的总金额
int coins[] = {1, 2, 5}; // 硬币种类及面值
int count = sizeof(coins) / sizeof(coins[0]); // 硬币种类数
int result = change(n, coins, count);
std::cout << "换法的种数: " << result << std::endl;
return 0;
}
```
在这个程序中,`change` 函数是一个递归函数,它接收金额、硬币数组和已经使用的硬币种类数作为参数。如果当前金额为0,说明找到一种换法;否则,遍历所有可用的硬币,尝试将每个硬币加入到组合中,并继续递归计算剩余金额。
注意:对于大一些的输入,这可能会超出栈空间导致堆栈溢出。实际应用中可能需要优化算法或者采用迭代而非递归的方式。
阅读全文