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