用c++解决●将零钱K ( 8sK<100分)换成1分、2分和5分的硬币组合(要求每种硬币至少有一-枚)。输入零钱金额,输出共有多少种不同的方法。
时间: 2024-10-26 19:03:12 浏览: 34
在C++中解决这个问题通常会采用动态规划的方法,因为这是一个典型的计数问题,可以转化为状态转移方程。我们可以定义一个二维数组`dp[]`,其中`dp[i]`表示有i分钱的情况下有多少种换零钱的方式。
首先,我们初始化`dp[0] = 1`,因为有0分的时候只有一种方式,就是不兑换任何硬币。然后对于每一个大于0的分值`i`,从1分到5分分别计算:
1. 如果`i`正好能被1整除,那么`dp[i]`就等于`dp[i - 1]`,因为我们已经找到了一种方式,即使用一枚1分硬币。
2. 对于2分,如果`i`减去2分后仍然非负,说明可以用一枚2分硬币替换掉部分钱,所以`dp[i] += dp[i - 2]`。
3. 类似地,对于5分,我们需要检查`i - 5`是否是非负的,如果是,则`dp[i] += dp[i - 5]`。
4. 注意处理边界情况,比如当i小于5时,不需要考虑5分的情况。
最后,`dp[K]`就是所有不同的换法数。这里是一个简单的伪代码描述:
```cpp
int countChange(int K) {
int dp[K + 1]; // 初始化数组大小为K+1
dp[0] = 1; // 0分有1种方式
for (int i = 1; i <= K; ++i) {
if (i >= 1) dp[i] += dp[i - 1]; // 1分
if (i >= 2) dp[i] += dp[i - 2]; // 2分
if (i >= 5) dp[i] += dp[i - 5]; // 5分
}
return dp[K];
}
```
阅读全文