杭电1284钱币兑换问题—背包dp/母函数(java)
生活随笔
收集整理的這篇文章主要介紹了
杭电1284钱币兑换问题—背包dp/母函数(java)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Problem Description
在一個國家僅有1分,2分,3分硬幣,將錢N兌換成硬幣有很多種兌法。請你編程序計(jì)算出共有多少種兌法。
Input
每行只有一個正整數(shù)N,N小于32768。
Output
對應(yīng)每個輸入,輸出兌換方法數(shù)。
Sample Input
2934
12553
Sample Output
718831
13137761
母函數(shù)暫時不會,只能用背包做,dp[i][j]表示使用前i種錢換成j的總共方式。首先要考慮初始問題,dp[i][0]=1;有再多的錢換成0元只有一種方式。dp[1][a[1]* q]=1; 這個表示第一種錢的倍數(shù)有一種方式,比如表示第一種錢是3塊的時候,dp[1][3]表示一張三塊,dp[1][3*2]表示6塊錢剛好可以用兩張三塊錢表示。
正常情況下的核心狀態(tài)轉(zhuǎn)移方程為
- if(i>j) {dp[i][j]=dp[i-1][j];}無法使用第i種錢,就是使用i-1種錢抓取j的方式數(shù)
- else {dp[i][j]=dp[i-1][j] dp[i][j-a[i]];}可以使用第i張,總個數(shù)就是不適用第i種的加上使用第i種的,不使用第i種就是dp[i-1][j],使用了i種就是dp[i][j-a[i]];其實(shí)這里有一個遞歸/調(diào)用自己的過程,使用了一張后dp[i][j-a[i]]在重新判斷這個數(shù)能否使用i,如果能使用,再次拆分,一直拆到最后無法使用i為止。附上代碼:
希望后面學(xué)了母函數(shù)能夠在用母函數(shù)寫出來!
更新母函數(shù)代碼,直接套模板即可
總結(jié)
以上是生活随笔為你收集整理的杭电1284钱币兑换问题—背包dp/母函数(java)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 杭电1260java实现
- 下一篇: 杭电1421java实现