用c++写出硬币选择问题:有1、3、5分面额的硬币,给定一个面值11分的价钱,问组成给定面值所需硬币的最少数量是多少。利用贪心算法的思想编程求解该问题。可以STL中的函数。
时间: 2024-10-18 11:18:19 浏览: 39
在C++中,我们可以使用贪心算法解决硬币选择问题。首先,我们需要创建一个包含不同面额的向量,并从大到小遍历这个向量。每次遍历时,如果当前面额小于目标金额,我们就尝试将尽可能多的这种面额的硬币加入,直到达到或超过目标金额为止。这样做的原因是贪心地选取最大的面额能最大程度减少硬币数量。
下面是一个简单的C++代码示例:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
int coinChange(std::vector<int>& coins, int amount) {
std::sort(coins.begin(), coins.end()); // 将硬币按面额降序排序
coins.push_back(0); // 添加一个特殊标记,表示“无硬币”
int minCoins = amount;
for (int i = coins.size() - 1; i >= 0; --i) { // 从最大面额开始
while (amount >= coins[i]) { // 只要还有足够的金额
amount -= coins[i]; // 使用当前面额硬币
if (amount == 0) { // 如果金额正好减完
return i + 1; // 返回所需的最小硬币数(包括了0)
}
}
}
return minCoins; // 如果找不到解决方案,则返回最多可能的数量
}
int main() {
std::vector<int> coins = {1, 3, 5};
int targetAmount = 11;
int result = coinChange(coins, targetAmount);
if (result != targetAmount) {
std::cout << "无法凑出" << targetAmount << "分钱,最少需要" << result << "枚硬币。\n";
} else {
std::cout << "可以使用" << result << "枚硬币组成" << targetAmount << "分钱。\n";
}
return 0;
}
```
阅读全文