人的理想志向往往和他的能力成正比。
--約翰遜
AI 啓蒙-無人售貨機智能找零算法
Martin 老師
【問題區】
你現在是一家無人售貨機生產公司的高級程序員,技術經理叫你實現無人售貨機智能找零錢的算法,具體需求如下:
當購物者購物後,插入一張滿足支付的人民幣,售貨機可以自動計算出找零的方案,並控制找零模塊出鈔,現在需要你實現找零算法找出所有的找零方案,供出鈔模塊選擇~
假設某一時刻零錢有 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