人的理想志向往往和他的能力成正比。
--约翰逊--
AI 启蒙-无人售货机智能找零算法
【问题区】
你现在是一家无人售货机生产公司的高级程序员,技术经理叫你实现无人售货机智能找零钱的算法,具体需求如下:
当购物者购物后,插入一张满足支付的人民币,售货机可以自动计算出找零的方案,并控制找零模块出钞,现在需要你实现找零算法找出所有的找零方案,供出钞模块选择~
假设某一时刻零钱有 50元一张,20元2张,10元2张,5元1张,1元8张,某用户随机购买商品(商品价格在1-99元之间)后,他投入一张面值大于所购商品价格的人民币(可选:5元, 10元, 20元, 50元, 100元),请列出所有找零方案!
【提示区】
此问题主要是要找出待找零的人民币任意相加刚好等于要找的零钱的所有组合,如,顾客购买的商品是3块,投入10块,那么可选的找零方案有:
1张5元 + 2张 1元
7张1元
【C代码实现区】
#include <stdio.h>
/***********************************
*输出当前找零方案对应的所有零钱的币值
************************************/
void print_solution(int changes[], int size, int solution){
int bit = 1;
int i = 0;
printf("已经为您找到一种解决方案:\n");
for(i=0; i<size; i++){
if((bit& solution)==bit){
printf(" %d ", changes[i]);
}
bit <<=1;
}
printf("\n");
}
int main(void){
//定义可用于找零的零钱池
int changes[]={1,2,2,5,10,20,50};
int total = 1;
int need = 0;
int num =sizeof(changes)/sizeof(int);
printf("请输入您要找的零钱数目:\n");
scanf("%d", &need);
//计算候选方案的数量
for(int i=0; i<num; i++){
total*=2;
}
//遍历所有的解决方案
for(int j=0; j<total; j++){
int res = 0;
int bit = 1;
for(int k=0; k<num; k++){
if((bit&j) == bit){
res+=changes[k];
}
bit<<=1;//0x01 => 0x10
}
if(res == need){
print_solution(changes, num, j);
}
}
return 0;
}
【视频讲解区】