日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

硬币找零问题,动态规划基础,百度面试题

發(fā)布時(shí)間:2025/3/15 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 硬币找零问题,动态规划基础,百度面试题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

問題描述:給出幾種面值的硬幣,要求用這幾種硬幣找零出所給零錢數(shù),用的硬幣數(shù)要最少。

過去我們用過貪心法解決此類問題,包括本人在百度面試時(shí),也是用的貪心法(面試官對這個(gè)解答不滿意),貪心法只適用于硬幣特殊的情況下(1,3,5),如果現(xiàn)在硬幣的面值為10,7,3,1,要求給出21的找零方案,那么貪心會給出10,7,3,1的方案,而不是3個(gè)7塊的最佳方案。

那么動態(tài)規(guī)劃又該如何解決,動態(tài)規(guī)劃在于在解決問題的途中用到之前的得到的答案。

思考:求n的找零方案時(shí),可將問題分解為1-(n-1)的找零方案中加上一個(gè)已知面值的硬幣,求其最小值便可。

代碼如下:

#include<iostream> using namespace std;//三個(gè)參數(shù)依次是硬幣面值數(shù)組,硬幣種類,給出的零錢 void getMin(int *values,int valueKinds,int money){int *coinUsed = new int[money+1]();int *coinUsedNum = new int[money+1]();//(之前寫的代碼無法得出在無法找零情況下的正確答案,用這個(gè)數(shù)組不僅可以記錄給出的硬幣,還可以得出是否能找開的情況) coinUsed[0] = 0;for(int cent=1;cent<=money;cent++){//每個(gè)零錢找零的最大值便是最小面值組成的個(gè)數(shù) int minCent = cent;int moneyUsed = 0;for(int kind=0;kind<valueKinds;kind++){if(values[kind]<=cent){//所查找找零最小數(shù)為已知的零錢找零數(shù) + 一個(gè)已有面值,便是最少硬幣方案 int temp = coinUsed[cent - values[kind]] + 1;//此處應(yīng)該做一個(gè)判斷,即是否找得開,找不開便不必更新最小值 if(temp <= minCent && (cent == values[kind] || coinUsedNum[cent - values[kind]] != 0)){minCent = temp;moneyUsed = values[kind];}}}coinUsed[cent] = minCent;coinUsedNum[cent] = moneyUsed;}if(coinUsedNum[money] == 0){printf("面值為%d的零錢找不開!", money);} else {printf("面值為%d的最少找零數(shù)為%d,", money,coinUsed[money]);printf("找零面值分別為:");while(money>0){printf(" %d",coinUsedNum[money]);money -= coinUsedNum[money];}} }int main(){int a[5] = {2,5,10,21,25};int money = 24;getMin(a,5,money); }

?

轉(zhuǎn)載于:https://www.cnblogs.com/tz346125264/p/7341143.html

總結(jié)

以上是生活随笔為你收集整理的硬币找零问题,动态规划基础,百度面试题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。