c语言贪心算法硬币问题
时间: 2023-11-19 10:54:54 浏览: 234
贪心算法是一种常用的算法思想,它在求解最少硬币问题中也有应用。该问题描述为:给顾客找零钱时,收银处有1元、5角和1角硬币若干,如何用最少数量的硬币找够零钱?贪心算法的思想是每次找零时都尽可能多地使用面值大的硬币,直到找够为止。具体实现可以按照以下步骤:
1. 将硬币按面值从大到小排序。
2. 从面值最大的硬币开始,尽可能多地使用该面值的硬币,直到无法再使用为止。
3. 如果还有剩余的找零金额,继续使用下一个面值的硬币,重复步骤2。
4. 直到找够为止,输出所需硬币的数量。
以下是一个C语言程序的范例,可以实现最少硬币问题的求解:
<<引用:贪心算法求解最少硬币问题C语言程序,问题描述:给顾客找零钱时,收银处有1元,5角和1角硬币若干,如何用最少数量的硬币找够零钱? 算法思想:比如要找给顾客2元9角钱,首先计算1元最多可以有多少枚,即2枚,减去2元,还...。>>
相关问题
c语言贪心算法找零钱
下面是一个用C语言实现的贪心算法找零钱的例子:
```c
#include <stdio.h>
void find_change(int total, int *coins, int size) {
int i, count;
printf("需要找的零钱总额为 %d 元\n", total);
printf("可以使用的硬币有:");
for (i = 0; i < size; i++) {
printf("%d元 ", coins[i]);
}
printf("\n");
for (i = 0; i < size; i++) {
count = total / coins[i];
if (count > 0) {
printf("需要%d个%d元硬币\n", count, coins[i]);
total -= count * coins[i];
}
if (total == 0) {
break;
}
}
if (total > 0) {
printf("无法凑出%d元零钱\n", total);
}
}
int main() {
int coins[] = {1, 2, 5, 10, 20, 50, 100};
int size = sizeof(coins) / sizeof(int);
int total = 87;
find_change(total, coins, size);
return 0;
}
```
这个例子中假设有1元、2元、5元、10元、20元、50元和100元硬币可供使用,现在要找87元的零钱。程序输出结果如下:
```
需要找的零钱总额为 87 元
可以使用的硬币有:1元 2元 5元 10元 20元 50元 100元
需要3个20元硬币
需要1个5元硬币
需要2个1元硬币
```
这个例子中的贪心策略是每次都选择面值最大的硬币。当然,这个策略并不一定总能得到最优解,但是在很多情况下都是有效的。
c语言贪心算法找零代码
这段代码是一个使用贪心算法来找零的C语言程序。贪心算法是一种在每一步选择中都采取在当前状态下最好或最优的选择,从而希望导致结果是全局最好或最优的算法。在这个程序中,我们先将所有的硬币都用7元硬币来代替,然后判断是否大于7元,如果小于7元则继续,如果大于7元则将之前的值舍去,重新分配硬币。最后输出i,m,n的数值,即a,b,c的个数。这个程序的时间复杂度为O(n^3)。
完整代码如下:
```
#include <stdio.h>
int main() {
int a = 10, b = 5, c = 2; // 硬币面值
int money = 69; // 需要找的钱数
int i, m, n, sum; // i、m、n分别对应c、b、a的个数
for (i = 0; i < 10; i++) {
for (m = 0; m < 10; m++) {
for (n = 0; n < 10; n++) {
sum = a * n + b * m + c * i; // 计算当前硬币组合的总面值
if (sum == money) break; // 如果找到了合适的硬币组合,则退出循环
}
if (sum == money) break;
}
if (sum == money) break;
else sum = 0; // 如果当前硬币组合不合适,则将sum清零,重新分配硬币
}
printf("%d %d %d %d", i, m, n, sum); // 输出硬币组合的个数
return 0;
}
```
阅读全文