人的理想志向往往和他的能力成正比。
--约翰逊
AI 启蒙-无人售货机智能找零算法
原创:Martin 老师 公众号:零基础零障碍学习C语言
【问题区】
你现在是一家无人售货机生产公司的高级程序员,技术经理叫你实现无人售货机智能找零钱的算法,具体需求如下:
当购物者购物后,插入一张满足支付的人民币,售货机可以自动计算出找零的方案,并控制找零模块出钞,现在需要你实现找零算法找出所有的找零方案,供出钞模块选择~
假设某一时刻零钱有 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;
}
【视频讲解】
详细讲解视频分享在腾讯视频,链接:https://v.qq.com/x/page/r08186cmodc.html
-----------------------------------------------------------------------------------------
更多C语言学习视频内容也可以关注我公众号: 零基础零障碍学习C语言
学习路线和建议
编程英语加油站
编程思维修炼
编程技术文章
IT职场提升
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。