動態規劃 整數劃分問題(2)

2021-07-28 06:49:57 字數 2060 閱讀 4644

整數劃分 --- 乙個老生長談的問題:

1) 練練組合數學能力.

2) 練練遞迴思想

3) 練練dp

總之是一道經典的不能再經典的題目:

這道好題求:

1. 將n劃分成若干正整數之和的劃分數。

2. 將n劃分成k個正整數之和的劃分數。

3. 將n劃分成最大數不超過k的劃分數。

4. 將n劃分成若干奇正整數之和的劃分數。

5. 將n劃分成若干不同整數之和的劃分數。

1.將n劃分成不大於m的劃分法:

1).若是劃分多個整數可以存在相同的:

dp[n][m]= dp[n][m-1]+ dp[n-m][m]  dp[n][m]表示整數 n 的劃分中,每個數不大於 m 的劃分數。

則劃分數可以分為兩種情況:

a.劃分中每個數都小於 m,相當於每個數不大於 m- 1, 故劃分數為 dp[n][m-1].

b.劃分中有乙個數為 m. 那就在 n中減去 m ,剩下的就相當於把 n-m 進行劃分, 故劃分數為 dp[n-m][m];

2).若是劃分多個不同的整數:

dp[n][m]= dp[n][m-1]+ dp[n-m][m-1]   dp[n][m]表示整數 n 的劃分中,每個數不大於 m 的劃分數。

同樣劃分情況分為兩種情況:

a.劃分中每個數都小於m,相當於每個數不大於 m-1,劃分數為 dp[n][m-1].

b.劃分中有乙個數為 m.在n中減去m,剩下相當對n-m進行劃分,

並且每乙個數不大於m-1,故劃分數為 dp[n-m][m-1]

2.將n劃分成k個數的劃分法:

dp[n][k]= dp[n-k][k]+ dp[n-1][k-1];

方法可以分為兩類:

第一類: n 份中不包含 1 的分法,為保證每份都 >= 2,可以先拿出 k 個 1 分

到每乙份,然後再把剩下的 n- k 分成 k 份即可,分法有: dp[n-k][k]

第二類: n 份中至少有乙份為 1 的分法,可以先那齣乙個 1 作為單獨的1份,剩

下的 n- 1 再分成 k- 1 份即可,分法有:dp[n-1][k-1]

3.將n劃分成若干奇數的劃分法:

g[i][j]:將i劃分為j個偶數

f[i][j]:將i劃分為j個奇數

g[i][j] = f[i - j][j]; 

f[i][j] = f[i - 1][j - 1] + g[i - j][j];

方法可以分為兩類:

第一類:i中拿出j個1分到每乙份中,將剩餘的i-j分成j個奇數

第二類:乙份包含奇數1,剩餘的i-1分成j-1個奇數;另一種,每份至少大於1,將j個1拿出來分到每乙份中,其餘i-j分成j份

#include#include#define nmax 51

int num[nmax][nmax]; //將i劃分為不大於j的個數

int num1[nmax][nmax]; //將i劃分為不大於j的不同的數

int num2[nmax][nmax]; //將i劃分為j個數

int f[nmax][nmax]; //將i劃分為j個奇數

int g[nmax][nmax]; //將i劃分為j個偶數

void init()

for (i = 1; i < nmax; i++) else if (i == j) else }}

f[0][0] = 1, g[0][0] = 1;

for (i = 1; i < nmax; i++)

}}int main()

res4 = num1[n][n];

printf("%d\n%d\n%d\n%d\n%d\n\n", res0, res1, res2, res3, res4);

}return 0;

}

整數劃分問題 動態規劃

原文出處 整數劃分 有以下情況 1 將n劃分成若干正整數之和的劃分數。2 將n劃分成k個正整數之和的劃分數。3 將n劃分成最大數不超過k的劃分數。4 將n劃分成若干奇正整數之和的劃分數。5 將n劃分成若干不同整數之和的劃分數。include includeconst int ns 55 int n,...

整數劃分問題解法2 動態規劃

整數劃分 乙個老生長談的問題 1 練練組合數學能力.2 練練遞迴思想 3 練練dp 總之是一道經典的不能再經典的題目 這道好題求 1.將n劃分成若干正整數之和的劃分數。2.將n劃分成k個正整數之和的劃分數。3.將n劃分成最大數不超過k的劃分數。4.將n劃分成若干奇正整數之和的劃分數。5.將n劃分成若...

整數劃分問題 動態規劃 遞迴

將乙個整數 n 劃分為 不超過m 組 的劃分數 如 n 4m 3 輸出 4 思路 使用動態規劃 定義狀態 dp i j j的i劃分的組數 遞推 dp i j dp i j i dp i 1 j 當m n時,變成了常見的整數劃分問題 cpp view plain copy include includ...