1. 程式人生 > >動態規劃 找零錢問題

動態規劃 找零錢問題

這個用貪心的話 會出錯 記錄一下這個例子 比如金額是10塊,面幣為2 5 6 11 10 按照貪心的話 肯定選6和2張2,但是隻要2張5塊就可以了,因此貪心法會出現問題,所以,需要用動態規劃,寫出狀態轉移方程,遍歷金額,隨後裡面套一個面幣數量的迴圈,當遍歷到當前金額的時候 只要當前金額減去當前面幣值大於0 隨後取這個後的最小和不取這個後的最小即可,可能語言組織不大好,直接上程式碼吧

#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;
}
http://blog.csdn.net/wdxin1322/article/details/9501163參考的部落格