整數劃分 三 NYIST 571

2021-06-22 10:20:26 字數 2694 閱讀 5970

1.將 n 劃分成每個數不大於 m 的劃分方案數:

①.若是劃分多個整數可以存在相同的:(詳見函式 f1 )

(dp1[n][k] 表示整數 n 的劃分中,每個數不大於 k 的劃分數。)

1).當n == 1時,只能劃分為1個數,該數為1,故劃分方案數為1,dp1[n][k] = 1

1).當k == 1時,只能劃分為n個數,均為1,故劃分方案數為1,dp1[n][k] = 1

2).當n < k時,被劃分的數為n,能劃分出的最大數為n,故 dp1[n][k] = dp1[n][n]

3).當n == k時,方案數為最大數等於n,即只取乙個n,和最大數為n - 1的方案數之和,故 dp1[n][k] = dp1[n][n] = dp1[n][n-1] + 1

4).不符合上述條件時:

dp1[n][k] = dp1[n][k-1] + dp1[n-k][k]

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

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

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

②.若是劃分多個不同的整數:(詳見函式 f4 )

(dp4[n][k] 表示整數 n 的劃分中,每個數不大於 k 的劃分數。)

1).當n == 1時,只能劃分出1個數,故 dp4[n][k] = 1

2).當n > 1 && k == 1時,最大數為1,因此劃分出 1 個 1 後無法從 n - 1 中劃分出不同的整數,故dp4[n][k] = 0

3).當n < k時,被劃分的數為n,能劃分出的最大數為n,故 dp4[n][k] = dp4[n][n]

4).當n == k時,方案數為最大數等於n,即只取乙個n,和最大數為n - 1的方案數之和,故 dp4[n][k] = dp4[n][n] = dp4[n][n-1] + 1

5).不符合上述條件時:

dp4[n][k] = dp4[n][k-1] + dp4[n-k][k-1]

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

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

b.劃分中有乙個數為 k. 在 n 中減去 k ,剩下相當對 n - k 進行劃分,並且每乙個數不大於 k - 1 ,故劃分數為 dp4[n-k][k-1]

2.將 n 劃分成 k 個數的劃分法:(詳見函式 f2 )

(dp[n][k] 表示整數 n 的劃分中,將 n 劃分成 k 個正整數之和的劃分數。)

1).當k == 1時,則劃分出1個數,該數為n,故dp2[n][k] = 1

2).當n == k時,則劃分出n個數,均為1,故dp2[n][k] = 1

3).當n < k時,無法將n劃分成k個數,故dp2[n][k] = 0

4).不符合上述條件時:

dp2[n][k] = dp2[n-k][k]+ dp2[n-1][k-1]

方法可以分為兩類:

第一類: n 份中不包含 1 的分法,為保證每份都 >= 2,可以先拿出 k 個 1 分到每乙份,然後再把剩下的 n- k 分成 k 份即可,分法有: dp2[n-k][k]

第二類: n 份中至少有乙份為 1 的分法,可以先那齣乙個 1 作為單獨的1份,剩下的 n- 1 再分成 k- 1 份即可,分法有:dp2[n-1][k-1]。

3.將 n 劃分成若干個奇數的和:(詳見函式 f3 )

(dp3[n][k] 表示整數 n 的劃分中,每個數不大於 k 的劃分數。)

1).當k == 1 || k == 2時,可以用來劃分的奇數只有1,所以種數也只能是一種。

2).當n < k的時候,多出的部分根本劃分不到,所以種數為:dp[n][n]

3).當n == k時,根據k的奇偶性判定是否劃分k,dp[n][n] = dp[n][k-1-(k&1))] + (k&1);

4).不符合上述條件時:

dp3[n][k] = dp3[n][k-1-!((k-1)&1))] + dp3[n-k][k-!(k&1)]

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

a.劃分中每個數都小於 k,相當於每個數不大於 k - 1, 若 k - 1 為奇數,則劃分出的每個數不大於 k - 1 ,否則劃分處的每個數不大於 k - 2 ,故劃分數為 dp[n][k-1-!((k-1)&1))].

b.劃分中有乙個數為 k. 那就在 n中減去 k ,剩下的就相當於把 n - k 進行劃分,若k為奇數,則劃分出的每個數不大於 k ,否則劃分出的每個數不大於 k - 1 ,故劃分數為 dp3[n-k][k-!(k&1)]

**如下:

#include const int n = 55;

int dp1[n][n], dp2[n][n], dp3[n][n], dp4[n][n];

int f1(int n, int k) // 劃分整數n時,劃分出的最大數不超過k的劃分數

int f2(int n, int k) // 劃分整數n時,將n劃分成k個正整數之和的劃分數

int f3(int n, int k) // 劃分整數n時,將n劃分成若干個奇正整數之和,劃分出的最大數不超過k的劃分數

int f4(int n, int k) // 劃分整數n時,將n劃分成若干不同整數之和,劃分出的最大數不超過k的劃分數

int main()

return 0;

}

NYOJ 571 整數劃分 三

描述 整數劃分是乙個經典的問題。請寫乙個程式,完成以下要求。輸入 每組輸入是兩個整數n和k。1 n 50,1 k n 輸出對於輸入的 n,k 第一行 將n劃分成若干正整數之和的劃分數。第二行 將n劃分成k個正整數之和的劃分數。第三行 將n劃分成最大數不超過k的劃分數。第四行 將n劃分成若干個 奇正整...

nyoj 571 整數劃分 三

時間限制 1000 ms 記憶體限制 65535 kb 難度 5描述 整數劃分是乙個經典的問題。請寫乙個程式,完成以下要求。輸入 多組輸入資料。每組輸入是兩個整數n和k。1 n 50,1 k n 輸出對於輸入的 n,k 第一行 將n劃分成若干正整數之和的劃分數。第二行 將n劃分成k個正整數之和的劃分...

NYOJ 571 整數劃分 三

第一行 將n劃分成若干正整數之和的劃分數。狀態轉移方程 dp i j 和為i 最大數不超過j的拆分數 dp i j 可以分為兩種情況 1 拆分項至少有乙個j 2 拆分項乙個j也沒有 dp i j dp i j j dp i j 1 第二行 將n劃分成k個正整數之和的劃分數。dp n k k 相當於把...