動態規劃 找零錢問題
阿新 • • 發佈:2019-01-25
這個用貪心的話 會出錯 記錄一下這個例子 比如金額是10塊,面幣為2 5 6 11 10 按照貪心的話 肯定選6和2張2,但是隻要2張5塊就可以了,因此貪心法會出現問題,所以,需要用動態規劃,寫出狀態轉移方程,遍歷金額,隨後裡面套一個面幣數量的迴圈,當遍歷到當前金額的時候 只要當前金額減去當前面幣值大於0 隨後取這個後的最小和不取這個後的最小即可,可能語言組織不大好,直接上程式碼吧
http://blog.csdn.net/wdxin1322/article/details/9501163參考的部落格#include <iostream> using namespace std; int main() { //硬幣面值的陣列 int values[100]; //要找零的數 int money,size; //儲存每個面值對應的最小值 因為0號位置要捨棄 因此要加1 //輸入總共有幾種面值 和從小到大輸入每種面值的大小 cout<<"輸入要找零的金額"; cin>>money; cout<<"輸入要面值的總數和種類"; cin>>size; for(int i = 0; i < size; i++) cin >> values[i]; int *coinsUsed = new int[money + 1]; coinsUsed[0] = 0; //總共的錢數的遍歷 int mincoin = 0; for(int i = 1; i <= money; i++){ mincoin = i; //總共有幾種面值的遍歷 for (int j = 0; j < size; j++) { //如果當前第j中面值小於總共的錢數 if(values[j] <= i){ //用了這一面值 前提是用這張紙幣的數量比不用這張紙幣的數量小採用 mincoin = min(mincoin,coinsUsed[i - values[j]] + 1); } } //當前金額所需的最小紙張數 coinsUsed[i] = mincoin; } cout<<"總共需要面幣張數為"<<coinsUsed[money]<<endl; return 0; }