用C语言解答:假设现在有面值为1元、3元和5元的硬币若干枚,如何用最少的硬币数凑够需要的金额?现输入一个数表示需要的金额,要求输出一个整数表示最少的硬币数。
时间: 2024-03-01 17:51:17 浏览: 154
这是一个经典的动态规划问题,可以使用C语言来解决。
思路如下:
1. 定义一个数组dp[n],表示凑够n元所需的最少硬币数;
2. 初始化dp[0] = 0,因为凑够0元不需要任何硬币;
3. 遍历1到n,对于每个i,遍历硬币面值j,如果j <= i,那么凑够i元所需的最少硬币数就是dp[i-j] + 1和dp[i]的较小值;
4. 最终dp[n]就是凑够n元所需的最少硬币数。
下面是代码实现:
```c
#include <stdio.h>
#include <limits.h>
int min(int a, int b) {
return a < b ? a : b;
}
int main() {
int n;
scanf("%d", &n);
int dp[n+1];
dp[0] = 0;
for (int i = 1; i <= n; i++) {
dp[i] = INT_MAX; // 初始化为最大值
for (int j = 1; j <= 5; j += 2) { // 只需要遍历1元和5元硬币
if (j <= i) {
dp[i] = min(dp[i], dp[i-j] + 1);
}
}
if (i >= 3) {
dp[i] = min(dp[i], dp[i-3] + 1);
}
}
printf("%d\n", dp[n]);
return 0;
}
```
在上面的代码中,我们只需要遍历1元和5元硬币,因为使用3个1元硬币的效果等同于使用1个5元硬币和1个1元硬币。所以,我们只需要检查是否需要使用3元硬币即可。
这个算法的时间复杂度是O(n),空间复杂度也是O(n)。
阅读全文