整數劃分問題是將乙個給定的正整數劃分成多個數的和,如給定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...