【程式設計師面試金典】有數量不限的硬幣,幣值為25分、10分、5分和1分,請編寫程式碼計算n分有幾種表示法。
題目描述
有數量不限的硬幣,幣值為25分、10分、5分和1分,請編寫程式碼計算n分有幾種表示法。
給定一個int n,請返回n分有幾種表示法。保證n小於等於100000,為了防止溢位,請將答案Mod 1000000007。
測試樣例:
6
返回:2
參考騎著炮彈進城提到的dp方法
這裡補充一些解釋,如有錯漏,還請指正。
我們用dp[i](i屬於1~n ) 表示組合成i元一共有幾種方法。
首先所有的硬幣組合問題都要有基礎面值:1元。i的總組合方法一定等於i中最後coin元不用新面值的方法+最後coin元使用新面值的方法。
而最後coin元 使用新面值的方法必然等於i-coin的總組合方法。
不用新面值的方法就是舊值
假如只有1元,那對於任給的1~n,必然只有1中組合方法。
假設增加一種新面值:coin元。對於任意i(i屬於1~n),
當i<coin的時候,新面值組合方法為0,dp[i]不變。
當i=coin,新組合方法為1,總dp[i]=舊dp[i]+1
當coin<i<2coin,新組合方法仍然為1,總dp[i]=舊dp[i] + 新dp[i-coin]
當i=2coin,仍然有總 dp[i]=舊dp[i] + 新dp[i- coin]
以coin=2為例
同樣的道理,題目coin值取值為:[1 5 10 25],迭代處理即可
程式碼如下:
class Coins {
public:
int countWays(int n) {
// write code here
int coins[4]={1,5,10,25};
int dp[100001]={0};
dp[0]=1;
for(int i=0;i<4;i++)
for(int j=coins[i];j<=n;j++)
dp[j] =(dp[j]+dp[j-coins[i]])%1000000007;
return dp[n];
}
};
https://blog.csdn.net/cy13299138237/article/details/50474271
問題描述:
有數量不限的硬幣,幣值為25分、10分、5分和1分,請編寫程式碼計算n分有幾種表示法。
求解思路:
這也是典型的動態規劃問題,我們可以這樣考慮:當只有1分的硬幣時,n從1到n分別有多少種表示方法;當有1分和5分的硬幣時,n從1到n分別有多少種表示方法,因此類推,直到我們將1分、5分、10分和25分的硬幣全部使用完。思想類似於0-1揹包問題,0-1揹包問題的具體求解方法可以參考我的上一篇部落格動態規劃之0-1揹包問題。我們用陣列coins[i]={1,5,10,25}表示各種幣值,此時可以維護一張二維表ways[i][j],其中橫座標表示前i種表示幣值,j表示硬幣的總值,則ways[i][j]表示能用前i種硬幣來表示j分的方法數。
當增加一種新的硬幣幣值時,有兩種情況:
(1)不加入此種幣值:ways[i][j]=ways[i-1][j];
(2)加入此種幣值:加入該枚硬幣之前的方法數為ways[i][j-coins[i]],那麼加入該枚硬幣之後構成j分的方法數也為ways[i][j-coins[i]]。
因此當增加一種新的幣值時,j分的表示方法數為ways[i][j]=ways[i-1][j]+ways[i][j-coins[i]]。
程式碼實現:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] coins = {1, 5, 10, 25};
int[][] ways = new int[4][n + 1];
for (int i = 0; i < 4; i++)
ways[i][0] = 1; //第0行初始化為1
for (int j = 1; j <= n; j++)
ways[0][j] = 1; //第0列初始化為1
for (int i = 1; i < 4; i++) {
for (int j = 1; j <= n; j++) {
if (j >= coins[i])
ways[i][j] = ways[i - 1][j] + ways[i][j - coins[i]];
else
ways[i][j] = ways[i - 1][j];
}
}
System.out.println(ways[3][n]);
}
}
當然,維護二維表未免過於複雜,我們可以維護一張一維表,即用一維陣列ways[j]來記錄j分的表示方法數。改進的程式碼實現如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int []coins={1,5,10,25};
int []ways=new int[n+1];
ways[0]=1;
for(int i=0;i<4;i++){
for(int j=coins[i];j<=n;j++){
ways[j]=ways[j]+ways[j-coins[i]];
}
}
System.out.println(ways[n]);
}
}
相關文章
- 【程式設計師面試金典】20180801程式設計師面試
- 【程式設計師面試金典】洪水程式設計師面試
- 程式設計師必知面試技術,程式設計面試IO模型有幾種?分別是什麼?程式設計師面試模型
- 程式設計師面試金典Chapter1程式設計師面試APT
- IT程式設計師面試技巧有哪些?程式設計師面試
- 給程式設計師的幾點程式設計經驗----《編寫高質量程式碼》程式設計師
- 智力題(程式設計師面試經典)程式設計師面試
- 程式設計師程式碼面試指南程式設計師面試
- PHP面試高薪寶典系列: 幾種常見的設計模式(附完整程式碼)PHP面試高薪設計模式
- [演算法練習及思路-程式設計師面試金典(Java解法)]No85計算器演算法程式設計師面試Java
- 面試中單例模式有幾種寫法?面試單例模式
- 華為程式設計師面試要改:網上程式設計 90 分鐘,現場程式設計 30 分鐘程式設計師面試
- 程式設計師只配加班?有錢有閒的程式設計師都在哪?程式設計師
- Java初中級程式設計師面試題寶典Java程式設計師面試題
- 好程式設計師:Java程式設計師面試秘籍程式設計師Java面試
- 【程式設計師面試金典】 寫出一個程式,接受一個十六進位制的數值字串,輸出該數值的十進位制字串。(多組同時輸入 )程式設計師面試字串
- 準備程式設計師面試?你需要了解這 14 種程式設計面試模式程式設計師面試模式
- 新書出版 |《Oracle程式設計師面試筆試寶典》新書Oracle程式設計師面試筆試
- 面試突擊50:單例模式有幾種寫法?面試單例模式
- 【JAVA面試資料】程式設計師面試之葵花寶典2Java面試程式設計師
- 【JAVA面試資料】程式設計師面試之葵花寶典1Java面試程式設計師
- 只會寫程式碼的程式設計師永遠無法出色?程式設計師
- 谷歌程式設計師有哪些高效的程式設計習慣?谷歌程式設計師
- 有贊996刷屏:男程式設計師們,別再低頭寫程式碼了996程式設計師
- 程式設計師如何寫出好程式碼?程式設計師
- 好程式設計師不寫程式碼程式設計師
- 2024年程式設計師金九銀十面試寶典(持續更新中................)程式設計師面試
- 程式設計師筆試和麵試過程中,有哪些是面試官眼中的減分項和加分項?程式設計師筆試面試
- 為什麼高階程式設計師討厭程式設計面試? - Adam程式設計師面試
- 為什麼程式設計師千萬不要重寫程式碼?程式設計師
- 面試了一個 39 歲程式設計師,我有點慌……面試程式設計師
- [演算法練習及思路-程式設計師面試金典(Java解法)]No77連續數列演算法程式設計師面試Java
- 程式設計師的35個壞習慣,你有幾條?程式設計師
- 程式設計師筆記|如何編寫高效能的Java程式碼程式設計師筆記Java
- 論跟程式設計師談話的技巧:千萬不要跟程式設計師說,你的程式碼有bug程式設計師
- 好程式設計師Linux雲端計算教程分享Shell指令碼面試題程式設計師Linux指令碼面試題
- 程式設計,不止有程式碼,還有藝術程式設計
- 數學,離一個程式設計師有多近?程式設計師