用c++解决 将零钱K ( 8≤K≤100分)换成1分、2分和5分的硬币组合(要求每种硬币至少有一-枚)。输入零钱金额,输出共有多少种不同的方法。
时间: 2024-10-25 17:16:31 浏览: 25
在C++中解决这个问题,可以使用动态规划(Dynamic Programming)的方法,创建一个数组dp[K+1],其中dp[i]表示使用1分、2分和5分硬币组成i分的不同方法数。因为每种硬币都至少需要一枚,所以初始时dp[0] = 1,表示只用1分硬币可以构成0分。
算法步骤如下:
1. 初始化dp数组:`dp[0] = 1`,其余位置设为0。
2. 对于每个金额i (从1到K),遍历可能使用的硬币面额:
- 如果i能被5整除,说明可以使用一个5分硬币,更新dp[i]为`dp[i] + dp[i-5]`。
- 否则,分别检查是否可以使用2分和1分硬币,更新dp[i]为`dp[i] + dp[i-2] + dp[i-1]`。
3. 最终,dp[K]就是不同的组合方法数。
以下是简单的C++代码示例:
```cpp
#include <iostream>
using namespace std;
int change(int n, int coins[] = {1, 2, 5}) {
int dp[n + 1];
memset(dp, 0, sizeof(dp));
dp[0] = 1;
for (int i = 1; i <= n; ++i) {
if (i >= coins[0]) {
dp[i] += dp[i - coins[0]];
}
if (i >= coins[1]) {
dp[i] += dp[i - coins[1]];
}
if (i >= coins[2]) {
dp[i] += dp[i - coins[2]];
}
}
return dp[n];
}
int main() {
int k;
cout << "请输入零钱金额(1-100分):";
cin >> k;
cout << "使用1分、2分和5分硬币组成的组合方法数是:" << change(k) << endl;
return 0;
}
```
阅读全文