硬币找零
假设硬币的面值分别为1元、5元、10元、25元和100元,有一个小店拥有各面值硬币数量无限个,顾客买东西之后需要给顾客找零,如何能够使找零的硬币个数最少?
示例
输入:36
输出:3
解释:找零[25, 10, 1]
为了尽量减少硬币的数量,首先得尽可能地多使用面值大的硬币,也就是优先使用大面值的硬币。
互动实验
硬币找零:逐枚取最大的可用硬币
访问权限PRO
PRO EXCLUSIVE探索不止于此
尊享 Pro 权益解锁完整互动实验、进阶解析与精选参考答案。
C
#include <stdio.h>
#include <stdlib.h>
static int cmp(const void *p1, const void *p2) {
int *num1 = (int *)p1;
int *num2 = (int *)p2;
return (*num1 > *num2) - (*num1 < *num2);
}
int get_min_coins(int *coins, int n, int price, int *solution) {
qsort(coins, n, sizeof(int), cmp);
int min_coins = 0;
for (int i = n - 1; i >= 0; i--) {
while (price >= coins[i]) {
solution[min_coins] = coins[i];
min_coins++;
price -= coins[i];
}
}
return min_coins;
}
int main(void) {
int coins[] = {1, 5, 10, 25, 100};
int n = sizeof(coins) / sizeof(coins[0]);
int price = 36;
int solution[price + 1];
int min_coins = get_min_coins(coins, n, price, solution);
for (int i = 0; i < min_coins; i++) {
printf("%d ", solution[i]);
}
printf("\n");
return 0;
}硬币面值为正整数,并按升序排列;数量无限。示例金额可以凑齐,其他面值体系需要另外验证贪心是否最优。
知识测验
题目
把面值换成1、3、4,给6找零,最大面值优先会怎样?
知识测验
题目
面值1、5、10、25、100给31找零,取25后下一枚是什么?
动手练习
按面值逐枚找零
面值
01
15
210
325
给48找零,各面值无限供应。按贪心策略写出每枚硬币取出后的剩余金额及最终组合。说明为什么不能把这个结果直接推广到任意面值体系。