時間限制:1000 ms | 記憶體限制:65535 kb
描述在現實生活中,我們經常遇到硬幣找零的問題,例如,在發工資時,財務人員就需要計算最少的找零硬幣數,以便他們能從銀行拿回最少的硬幣數,並保證能用這些硬幣發工資。
我們應該注意到,人民幣的硬幣系統是 100,50,20,10,5,2,1,0.5,0.2,0.1,0.05,
0.02,0.01 元,採用這些硬幣我們可以對任何乙個工資數用貪心演算法求出其最少硬幣數。
但不幸的是: 我們可能沒有這樣一種好的硬幣系統, 因此用貪心演算法不能求出最少的硬幣數,甚至有些金錢總數還不能用這些硬幣找零。例如,如果硬幣系統是 40,30,25 元,那麼 37元就不能用這些硬幣找零;95 元的最少找零硬幣數是 3。又如,硬幣系統是 10,7,5,1元,那麼 12 元用貪心法得到的硬幣數為 3,而最少硬幣數是 2。
你的任務就是:對於任意的硬幣系統和乙個金錢數,請你程式設計求出最少的找零硬幣數;
如果不能用這些硬幣找零,請給出一種找零方法,使剩下的錢最少。
輸入輸入資料:
第 1 行,為 n 和 t,其中 1≤n≤50 為硬幣系統中不同硬幣數;1≤t≤100000 為需要用硬幣找零的總數。
第 2 行為 n 個數值不大於 65535 的正整數,它們是硬幣系統中各硬幣的面值。
當n,t同時為0時結束。
輸出輸出資料:
如 t 能被硬幣系統中的硬幣找零,請輸出最少的找零硬幣數。
如 t 不能被硬幣系統中的硬幣找零,請輸出剩下錢數最少的找零方案中的最少硬幣數。
樣例輸入
4 12樣例輸出10 7 5 1
2遞迴解法:
按照紫書的思路,儲存點即可,難點就是該題目是有可能找不到這個錢數的,所以有可能找到3元的時候要7張錢,但是找到2元卻要12張,而答案只能輸出12
我的解決方法是將一開始全部設定為最大值,那麼加入找不到這個錢數的話最後答案會是 最大值+,這時候我們就向下的錢數遞迴,而判斷是否已經求過這個數,就是檢視是否為inf
#include using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
int n,t;
int val[55];
int num[100010];
int dp(int v)
int main()
for(int i = t; i >= 0; i--) }}
return 0;
}
遞推解法:
遞推比遞迴簡單一點,最後能找的錢數想法和遞迴一樣,迴圈到小於inf就是代表著求出答案
#include using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
int n,t;
int val[55];
int num[100010];
int main()
for(int i = 1; i <= t; i++)
}for(int i = t; i >= 0; i--) }}
return 0;
}
硬幣找零問題(動態規劃)
給定指定的硬幣種類,面值為 1,3,5 在此具體化些 給定所找零的錢數 sum,給出最少的硬幣找零數,每個種類的硬幣無限使用。看到這問題,當時我想到用貪心演算法來求解,最後求解方案因為巧合對了,後來在網上看到動態規劃的題目,才知道貪心演算法得不到最優解,比如 給定 面值為 1,3,4,給定找零數為 ...
動態規劃 硬幣找零思路
硬幣找零問題,有兩種。一種用貪心解決,一種用動態規劃解決。問題1 假設我們有 v1,v2,vn 單位是元 這些幣值的硬幣,它們的張數分別是 c1 c2 cn。我們現在要用這些錢來找零 w元,最少要用多少張紙幣呢?問題2 假設我們有幾種不同幣值的硬幣 v1,v2,vn 單位是元 如果我們要支付 w 元...
動態規劃 最小硬幣找零
用的硬幣面額d1 dn 及其數量,找出有多少種找零方法。最少硬幣找零問題是給出要找零的錢數,以及可用的硬幣面額d1 dn 及其數量,找到所需的最少的硬幣個數。最小硬幣找零 function mincoinchange coins var cache this.makechange function ...