1. 程式人生 > >codevs 3961 硬幣找零【完全背包DP/記憶化搜索】

codevs 3961 硬幣找零【完全背包DP/記憶化搜索】

得到 可能 代碼 好的 default ++ -h 數值 rip

題目描述 Description

在現實生活中,我們經常遇到硬幣找零的問題,例如,在發工資時,財務人員就需要計算最少的找零硬幣數,以便他們能從銀行拿回最少的硬幣數,並保證能用這些硬幣發工資。 我們應該註意到,人民幣的硬幣系統是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。

你的任務就是:對於任意的硬幣系統和一個金錢數,請你編程求出最少的找零硬幣數;如果不能用這些硬幣找零,請給出一種找零方法,使剩下的錢最少。

輸入描述 Input Description

第1 行,為N 和T,其中1≤N ≤50 為硬幣系統中不同硬幣數;1≤T≤100000 為需要用硬幣找零的總數。

第2 行為N 個數值不大於65535 的正整數,它們是硬幣系統中各硬幣的面值。

輸出描述 Output Description

如T 能被硬幣系統中的硬幣找零,請輸出最少的找零硬幣數。

如T 不能被硬幣系統中的硬幣找零,請輸出剩下錢數最少的找零方案中的最少硬幣數。

樣例輸入 Sample Input

4 12

10 7 5 1

樣例輸出 Sample Output

2

數據範圍及提示 Data Size & Hint

青銅水題

【題意】:題意:先輸入n和m,下一行輸入n種硬幣,每一種都有一個面值。 問組成m所需要的最少的硬幣數量.完全背包問題。 雖然題目中涉及到可不可以組成,可以的時候,如同第一組數據,最小硬幣數為2、 不能組成的時候,如同第二組數據,補充現有硬幣面值的個數,看達到m時最小的數量

【代碼】:

#include<cstdio>
#include
<cstring> #include<queue> #include<iostream> #include<stack> #define maxn 100005 #define maxm 505 #define INF 0x3f3f3f3f #define ll long long using namespace std; int a[55]; int dp[maxn]; int main() { int n,m; while(cin>>n>>m) { for(int i=1;i<=n;i++) cin>>a[i]; for(int i=0;i<=m;i++) dp[i]=INF; dp[0]=0; for(int i=1;i<=n;i++){ for(int j=a[i];j<=m;j++){ dp[j]=min(dp[j],dp[j-a[i]]+1); } } printf("%d\n",dp[m]); } }

codevs 3961 硬幣找零【完全背包DP/記憶化搜索】