用c语言编程:这是一个古老而又经典的问题。用给定的几种钱币凑成某个钱数,一般而言有多种方式。例如:给定了6种钱币面值为2、5、10、20、50、100,用来凑15元,可以用5个2元、1个5元,或者3个5元,或者1个5元、1个10元,等等。显然,最少需要2个钱币才能凑成15元。 你的任务就是,给定若干个互不相同的钱币面值,编程计算,最少需要多少个钱币才能凑成某个给出的钱数
时间: 2024-03-07 21:47:55 浏览: 54
钱币组合方法数的问题
好的,这是一个经典的动态规划问题。我们可以定义一个一维数组dp,其中dp[i]表示凑成金额i所需的最少硬币数。
初始化数组dp的值为无穷大,除了dp[0] = 0,表示凑成金额为0时不需要任何硬币。然后,我们遍历所有的硬币面值,对于每个硬币面值j,我们更新dp数组的值,具体做法是:
如果j <= i,表示硬币面值j能够被用于凑成金额i,此时我们可以选择使用硬币面值j,也可以选择不使用。如果选择使用,那么最少需要的硬币数就是dp[i-j] + 1;如果选择不使用,那么最少需要的硬币数就是dp[i],两者取最小值即可。
最后,dp数组中的dp[amount]就是凑成金额amount所需的最少硬币数。
下面是用C语言实现的代码:
```c
#include <stdio.h>
#include <limits.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] = INT_MAX;
for (int j = 0; j < coinsSize; j++) {
if (coins[j] <= i && dp[i - coins[j]] != INT_MAX) {
dp[i] = min(dp[i], dp[i - coins[j]] + 1);
}
}
}
return dp[amount] == INT_MAX ? -1 : dp[amount];
}
int main() {
int coins[] = {2, 5, 10, 20, 50, 100};
int coinsSize = 6;
int amount = 15;
int result = coinChange(coins, coinsSize, amount);
printf("需要的最少硬币数为:%d\n", result);
return 0;
}
```
阅读全文