用c语言求解硬币问题。有1分、2分、5分、10分、50分和100分的硬币各若干枚,现在要用这些硬币支付W元,最少需要多少枚硬币?
时间: 2023-06-03 11:07:04 浏览: 346
这个问题可以使用贪心算法解决。我们可以先将硬币的面额按照从大到小的顺序排序,然后从面额最大的硬币开始尽可能多地选择,直到总面额等于W为止。代码实现如下:
#include <stdio.h>
int main()
{
int coins[] = {100, 50, 10, 5, 2, 1}; // 硬币的面额
int n = sizeof(coins) / sizeof(int); // 硬币的种类数目
int W = 87; // 支付的金额
int cnt = 0; // 使用的硬币数量
int i;
for (i = 0; i < n; i++) {
int k = W / coins[i]; // 当前面额硬币最多可以选择的数量
cnt += k; // 累加硬币数量
W -= k * coins[i]; // 更新支付金额
}
printf("最少需要使用%d枚硬币\n", cnt);
return 0;
}
运行结果为:"最少需要使用7枚硬币"。
相关问题
C语言,求解硬币问题,有1分,2分,5分,10分,50分,100分硬币各若干个,用这些硬币支付M元,最少需要多少枚硬币
这是一个经典的硬币找零问题,可以使用贪心算法来解决。贪心算法的思路是每次尽量使用面值最大的硬币,直到支付金额为0。
具体实现可以按照以下步骤:
1. 定义一个数组coins,存储硬币的面值,按照从大到小排序。
2. 定义一个变量count,表示最少需要的硬币数量,初始化为0。
3. 从大到小遍历硬币面值数组coins,每次尽量使用当前面值的硬币,直到支付金额为0或者硬币用完为止,每使用一枚硬币,将count加1。
4. 返回count即可。
以下是C语言代码实现:
```c
#include <stdio.h>
int main()
{
int coins[] = {100, 50, 10, 5, 2, 1}; // 硬币面值从大到小排序
int n = sizeof(coins) / sizeof(int); // 硬币种类数
int money, count = 0; // 支付金额和最少需要的硬币数量
printf("请输入支付金额:");
scanf("%d", &money);
for (int i = 0; i < n; i++) {
while (money >= coins[i]) { // 尽量使用当前面值的硬币
money -= coins[i];
count++;
}
if (money == 0) break; // 支付金额为0,退出循环
}
printf("最少需要的硬币数量为:%d\n", count);
return 0;
}
```
需要注意的是,贪心算法并不一定能得到最优解,但对于硬币找零问题来说,贪心算法可以得到最优解。
用c语言写一个求解分饼干问题
好的,分饼干问题可以用贪心算法解决,下面是用C语言实现的代码:
```
#include <stdio.h>
#include <stdlib.h>
int compare(const void *a, const void *b) {
return (*(int *)b - *(int *)a); // 从大到小排序
}
int main() {
int n, m;
printf("请输入小朋友的数量和饼干数量:\n");
scanf("%d %d", &n, &m);
int children[n], i;
printf("请输入每个小朋友的胃口值:\n");
for (i = 0; i < n; i++) {
scanf("%d", &children[i]);
}
qsort(children, n, sizeof(int), compare); // 对小朋友的胃口值进行排序
int j = 0, count = 0;
for (i = 0; i < n && j < m; i++) {
if (children[i] <= m - j) { // 如果当前饼干数量能够满足当前小朋友的胃口值
j += children[i]; // 将饼干数量减去当前小朋友的胃口值
count++; // 记录发放的饼干数量
}
}
printf("最多可以满足 %d 个小朋友的胃口。\n", count);
return 0;
}
```
代码的思路是先将小朋友的胃口值从大到小排序,然后从胃口值最大的小朋友开始发放饼干,直到饼干数量不足或者所有小朋友的胃口都被满足。