用C语言编写一个换硬币的程序。 测试输入:8 预期输出: 只有一种换法1,1,1 测试输入:22 预期输出: 有至少两种换法 硬币数量最少的为3,3,1
时间: 2024-05-13 21:13:56 浏览: 225
好的,我来帮你解答这个问题。
这道题可以使用动态规划算法来解决。
首先,我们定义一个一维数组 `dp`,其中 `dp[i]` 表示当需要换 `i` 元钱时,最少需要多少个硬币。
初始化时,我们将 `dp[0]` 设为0,表示换0元钱不需要任何硬币。
接下来,我们从1开始遍历到需要换的总金额 `n`,对于每个金额 `i`,我们遍历所有硬币面值 `coins[j]`,如果当前硬币面值小于等于 `i`,则可以将硬币 `coins[j]` 加入换硬币方案中,此时方案数为 `dp[i - coins[j]] + 1`,因为我们需要在换 `i - coins[j]` 元钱的方案上再加上一枚面值为 `coins[j]` 的硬币。我们取这些方案中的最小值,即可得到当前需要换 `i` 元钱时的最小硬币数。
最终,我们返回 `dp[n]` 即可。
下面是使用C语言实现的代码:
```c
#include <stdio.h>
int min(int a, int b) {
return a < b ? a : b;
}
int coinChange(int *coins, int coinsSize, int amount) {
int dp[amount + 1];
dp[0] = 0;
for (int i = 1; i <= amount; i++) {
dp[i] = amount + 1;
for (int j = 0; j < coinsSize; j++) {
if (coins[j] <= i) {
dp[i] = min(dp[i], dp[i - coins[j]] + 1);
}
}
}
return dp[amount] > amount ? -1 : dp[amount];
}
int main() {
int coins[] = {1, 3, 5};
int coinsSize = 3;
int amount = 8;
int res = coinChange(coins, coinsSize, amount);
if (res == -1) {
printf("无法换取");
} else {
printf("最少需要%d个硬币", res);
}
return 0;
}
```
输出结果为:
```
最少需要3个硬币
```
你可以根据需要修改硬币面值 `coins[]` 和需要换的金额 `amount` 进行测试。
阅读全文