動態規劃求解 貨幣兌付問題

2021-08-20 22:18:02 字數 1803 閱讀 7437

在面值為(v1, v2, …, vn)n種貨幣中,需要支付y值的貨款,應如何支付才能使貨幣支付的張數最少。設計動態規劃演算法求解該問題

貨幣兌換問題可以看作是決策乙個序列(v1, v2, …, vn),對任一變數vi的決策是決定ni=x還是ni=0。在對vi-1決策後,已確定了(v1, …, vi-1),在決策vi時,問題處於下列兩種狀態之一:

(1)硬幣面值vi超過要支付的面額pi,則ni=0,

(2)硬幣面值vi可以支付的要支付的面額pi ,則要考慮支付後是否可以使硬幣的枚數減少(本題不考慮)

根據分析,完成貨幣兌付問題的**,其中貨幣的個數為5,面值為1,2,5,7,9,需要支付的金額由使用者輸入。

####**:

#includeusing namespace std;

#define m 5 //貨幣的種類數目

#define n 1000 //最大的支付金額

//定義存放動態規劃子問題解的**,m+1行n+1列

//每行每列都要多乙個,因為要存放無解和無需支付的情況

int a[m+1][n+1];

//取它們的最小值,誰有解取誰,如果都沒有解,那麼都是-1 ,返回誰都可以

int min(int num1,int num2)

} //2、求選擇硬幣的個數

j=n;

for(i=m;i>0;)

else

i--; }

//3、輸出二位**

cout<

{ //判斷sum是否等於輸入的金額,如果等於了,那麼就不用輸出『+』號了

sum+=money[i]*count[i];

if(sum!=n)

cout這個問題的思想和0/1揹包問題一樣,利用二位陣列將子問題的解儲存下來,然後根據當前的狀態來求解當前的解。

核心:1、填寫二位陣列,判斷當前位置需支付的金額是否大於硬幣的價值,大於就使用該硬幣支付,並判斷子問題與新解哪個更優,取優值;否則就是上一行該列的值,即子問題的解。

2、求完二位陣列後,要知道是使用那些硬幣來支付的,這裡與揹包問題稍微有些不同,揹包問題只用知道某件物品裝或沒裝,而硬幣問題還需要知道該枚硬幣使用了幾枚。所以我們定義整形的一維陣列來標識該物品裝入的數量即可,讓它的初值為0,表示使用0枚,這樣迴圈下來,使用過的硬幣就不會是0,對應輸出它的值就可以知道某枚硬幣使用了幾個。

動態規劃法,讓人覺得這是個『聰明的演算法』,讓我感覺到了把人的思想寫成了**,因為它每次都是根據當前的狀態來決定下一步該做什麼決策。最經典的問題是「海盜分鑽石」問題。

五個海盜搶了一百顆鑽石,每顆都價值連城。五個海盜都很貪婪,他們都希望自己能分得最多的鑽石,但同時又都很明智。於是他們按照抽籤的方法排出乙個次序。首先由抽到一號籤的海盜說出一套分鑽石的方案,如果5個人中有50%(以上)的人同意,那麼便依照這個方案執行,否則的話,這個提出方案的人將被扔到海浬餵魚,接下來再由抽到二號籤的海盜繼續說出一套方案,然後依次類推到第五個。記住,五個海盜都很聰明哦!

答案:

第乙個人:97,0,1,2,0

第二個人:98,0,1,1

第三個人:100,0,0

動態規劃 貨幣系統問題

動態規劃 貨幣系統問題 時間限制 1 sec 記憶體限制 64 mb 貨幣是在國家或經濟體內的物資與服務交換中充當等價物,或是償還債務的特殊商品,是用作交易媒介 儲藏價值和記賬單位的一種工具。魔法世界的貨幣的歷史,可以追溯至史前以物易物的階段,後來經過金屬貨幣 金銀 紙幣以及金銀本位制度,演化至現代...

動態規劃 貨幣系統問題

時間限制 1 sec 記憶體限制 64 mb 提交 88 解決 62 提交 狀態 討論版 命題人 題目描述 貨幣是在國家或經濟體內的物資與服務交換中充當等價物,或是償還債務的特殊商品,是用作交易媒介 儲藏價值和記賬單位的一種工具。魔法世界的貨幣的歷史,可以追溯至史前以物易物的階段,後來經過金屬貨幣 ...

動態規劃求解路徑問題

動態規劃求解的兩個條件 1 最優解問題 2 大問題可以拆分成小問題,大問題的最優解包含小問題的最優解,將小問題的最優解儲存起來,在求大問題最優解的時候無需重新求解,直接拿來用即可。具體問題 需求一 給定m n矩陣,從左上角出發,到右下角,每次只能向右走或者向下走,求共有多少路徑?分析 假設路徑數是f...