整數劃分的dfs和dp

2021-09-10 01:50:20 字數 949 閱讀 8284

整數劃分問題是將乙個給定的正整數劃分成多個數的和,如給定5,劃分的結果如下所示,注意這裡將重複的劃分剔除了。

比如5=1+1+1+2=1+1+2+1=1+2+1+1=2+1+1+1只保留了第乙個。

5 = 1+1+1+1+1

5 = 1+1+1+2

5 = 1+1+3

5 = 1+2+2

5 = 2+3

5 = 1+4

5 = 5

dfs**如下:

int ans[

100]

, cnt;

//ans陣列記錄每次選取的數,cnt記錄總的劃分數

//當n = 0時,表明n已經被瓜分完,因此這裡可以輸具體劃分方案

void

dfs(

int n,

int k,

int ns)

else

for(

int i = ns; i <= n; i++)}

}

dp**如下:

intdp(

int n,

int m)

當然dfs也可以指定拆分的數字

int ans[

100]

, cnt, m[5]

=;void

dfs(

int n,

int k,

int ns)

else

for(

int i =

1; i <=

4; i++)}

}

指定數字的整數劃分實際就是找零錢問題,這裡就是要將給定的n元,使用1、3、4、7四種面額的所有方法,當然如果要求最小,只需要稍微處理即可。

下面這篇部落格對整數劃分做了較為全面的總結:

整數劃分 (dfs)

include 整數劃分問題是演算法中的乙個經典命題之一,有關這個問題的講述在講解到遞迴時基本都將涉及。所謂整數劃分,是指把乙個正整數n寫成如下形式 n m1 m2 mi 其中mi為正整數,並且1 mi n 則為n的乙個劃分。如果中的最大值不超過m,即max m1,m2,mi m,則稱它屬於n的乙個...

整數劃分(劃分dp)總結

寫了幾個題發現整數劃分是一類題,而不是一道題。具體題型 1 n相同元素放入m個相同的盤子 盤子允許為空 例題 放蘋果 poj 1664設dp i j 為 j 個元素放入i個盤子轉移方程 dp i j dp i 1 j 新新增乙個盤子,盤子為空 dp i j dp i j i i個盤子 各取出乙個 2...

整數劃分問題 DP

整數劃分的定義 n m1 m2 mi 其中mi為正整數,並且1 mi n 則為n的乙個劃分。如果中的最大值不超過m,即max m1,m2,mi m,則稱它屬於n的乙個m劃分。這裡我們記n的m劃分的個數為f n,m 舉個例子,當n 5時我們可以獲得以下這幾種劃分 注意,例子中m 5 5 5 4 1 3...