凑硬币,1角,2角,5角的硬币怎么凑出十以下的金额?c语言代码
时间: 2024-11-13 18:22:16 浏览: 60
"凑硬币"的问题可以转换成一个经典的组合优化问题,通常通过动态规划来解决。在C语言中,我们可以创建一个二维数组来存储每种组合下剩余金额的可能性。以下是简单的C语言代码示例:
```c
#include <stdio.h>
#define COIN_VALUES {1, 2, 5} // 定义硬币面值
#define NUM_COINS (sizeof(COIN_VALUES) / sizeof(int)) // 硬币种类数
int minCoins(int coins[], int n, int target) {
int dp[target + 1]; // 初始化dp数组,用于存储达到每个目标金额所需的最小硬币数
for (int i = 0; i <= target; ++i)
dp[i] = INT_MAX; // 初始化所有状态为无限大
dp[0] = 0; // 目标金额为0时,不需要硬币,dp[0]=0
// 动态规划过程
for (int coin_val : coins) {
for (int i = coin_val; i <= target; ++i) {
if (dp[i - coin_val] != INT_MAX) // 如果存在较小金额下的最优解,则更新dp[i]
dp[i] = min(dp[i], dp[i - coin_val] + 1);
}
}
return dp[target] == INT_MAX ? -1 : dp[target]; // 如果找不到解决方案,返回-1;否则返回所需硬币数
}
int main() {
int coins[] = COIN_VALUES;
int target = 9; // 设定一个需要凑出的小于10元的目标金额
printf("最少需要 %d 枚硬币凑出 %d 元\n", minCoins(coins, NUM_COINS, target), target);
return 0;
}
```
这个程序会输出每个小于10元的目标金额所需的最少硬币数量,如果无法凑出该金额,则返回-1。
阅读全文