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 相當於把...