http://www.cnblogs.com/xiaoxian1369/archive/2011/09/12/2174212.html
整數劃分 --- 一個老生長談的問題:
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];