錢幣組合問題(二) (每種硬幣次數受限)

2021-08-08 17:21:53 字數 1519 閱讀 3138

description

設有n種不同的錢幣各若干,可用這n種錢幣產生許多不同的面值。

如給定面值7分,有1分3張,2分3張,5分1張,能組成給定面值7分的方法有如下4種:

3個1分+2個2分;

1個1分+3個2分;

2個1分+1個5分;

1個2分+1個5分。

你的程式設計任務:給定面值m,和n種不同錢幣及其張數,求給定面值m能有多少種不同的構成方法數。

input

第1行有1個正整數n(1<=n<=10),表示有n種不同的錢幣。

第2行有n個數,分別表示每種錢幣的面值v[1]...v[n](0<=v[i]<=100,1<=i<=n)。

第3行有n個數,分別表示每種錢幣的張數k[1]...k[n](0<=k[i]<=100,1<=i<=n)。

第4行有1個數,表示給定的面值m (1<=m<=20000)。

output

計算出給定面值不同的方法種數

sample input3

1 2 5

3 3 1 7

sample output4

思路:與前篇文章思路類似,增加判斷條件即可

思路一:暴力窮舉

思路二:深度優先遍歷,分支限界,n過大時會超時,思路同前一篇文章,限界條件為當前金額大於要求金額或者當前使用數目大於提供數量

static int dc = 0;

static int sum = new int[10000];

/***

* @param count 當前總值

* @param location 當前下標

* @param n 題幹中總面額

* @param coins 硬幣型別

* @param k 硬幣個數

*/public static void dfs(int count,int location,int n,int coins,int k)else

}} system.out.println(d[coins.length][n]);

}

當然這個過程是乙個累加的過程,二維陣列邏輯好理解,也可以用一位陣列表示,更簡單

/**

* 一維陣列

* @param n 種類數

* @param v 幣值

* @param k 張數

* @param m 面值

* @return

*/public static int solve(int n, int v, int k, int m)

for(int i=1; i0; j--)}}

return dp[m];

}

個人傾向於二維陣列,因為劉玉貴老師上課時講的作業題一般都是用二維陣列,習慣了(*^__^*) 嘻嘻……

硬幣組合問題

1分2分5分的硬幣,組成1角,共有多少種組合。不妨將這個問題一般化,即給定乙個非負陣列,求有多少種組合可以組成n。dp i n 表示用前i 1中硬幣所能組成的n的種數 遞推關係 dp i sum dp i 1 sum 0vm dp i 1 sum 1vm dp i 1 sum 2vm dp i 1 ...

硬幣組合問題 動態規劃

如果我們有面值為1元 3元和5元的硬幣若干枚,如何用最少的硬幣湊夠11元?表面上這道題可以用貪心演算法,但貪心演算法無法保證可以求出解,比如1元換成2元的時候 首先我們思考乙個問題,如何用最少的硬幣湊夠i元 i 11 當i 0,即我們需要多少個硬幣來湊夠0元。由於1,3,5都大於0,即沒有比0小的幣...

騰訊 硬幣面值組合問題

題目描述 有n種不同面值的硬幣,每種面值的硬幣都有無限多個。為了方便攜帶,希望帶盡量少的硬幣,並且要能組合出1到m之間 包括1和m 的所有面值。輸入第一行包含兩個整數m,n,含義如題目所述。第二行包含n個整數,第i個整數表示第i種硬幣的面值。輸出輸出乙個整數,表示最少需要攜帶的硬幣數量。如果無解,則...