换硬币ptac++
时间: 2025-05-23 21:22:51 浏览: 15
### 硬币兑换算法 C++ 实现
硬币兑换问题是经典的动态规划问题之一,目标是找到能够组成特定总金额所需的最少硬币数量。以下是基于动态规划方法的 C++ 实现:
#### 动态规划核心思想
创建一个大小为 `amount + 1` 的数组 `dp`,其中 `dp[i]` 表示凑成金额 `i` 所需的最少硬币数。初始时将所有值设为正无穷大(表示不可达),并将 `dp[0]` 设为 0(因为凑成金额 0 不需要任何硬币)。通过迭代更新每个子问题的结果来逐步构建最终解。
#### 源代码实现
以下是一个完整的 C++ 实现代码[^3]:
```cpp
#include <iostream>
#include <vector>
#include <climits>
using namespace std;
int coinChange(vector<int>& coins, int amount) {
vector<int> dp(amount + 1, INT_MAX);
dp[0] = 0;
for (int i = 1; i <= amount; ++i) {
for (const auto& coin : coins) {
if (i >= coin && dp[i - coin] != INT_MAX) {
dp[i] = min(dp[i], dp[i - coin] + 1);
}
}
}
return dp[amount] == INT_MAX ? -1 : dp[amount];
}
int main() {
vector<int> coins = {1, 2, 5}; // 可选硬币面额
int amount;
cout << "请输入要兑换的总金额: ";
cin >> amount;
int result = coinChange(coins, amount);
if (result != -1) {
cout << "最少需要的硬币数量为: " << result << endl;
} else {
cout << "无法用给定硬币凑成该金额" << endl;
}
return 0;
}
```
#### 运行逻辑说明
上述程序实现了 LeetCode 零钱兑换问题的核心功能[^4]。它接受一组硬币面额以及目标金额作为输入,并输出所需最少硬币数目或者 `-1` 来表明不可能完成兑换。具体过程如下:
- 初始化动态规划表 `dp` 并设定边界条件。
- 对于每一个金额值 `i` 和每一种可用硬币 `coin`,尝试更新当前状态下的最优解。
- 如果最后的状态仍保持未被修改,则返回 `-1`;否则返回对应的最小硬币计数值。
此解决方案的时间复杂度主要由两层嵌套循环决定,即 O(n * m),其中 n 是目标金额而 m 则代表硬币种类总数[^5]。
---
阅读全文
相关推荐












