標籤:
問題:
1. 將n劃分成最大數不超過k的劃分數。
2. 將n劃分成k個正整數之和的劃分數。
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];
1.d[i][j] 表示把i分成不大於j的劃分數的種數
int d[maxn][maxn];int dfs(int n,int m){ if(m == 1) return d[n][m] = 1; if(n < m) return dfs(n,n); if(m == n) return d[n][m] = dfs(n,m-1) + 1; return d[n][m] = dfs(n,m-1) + dfs(n-m,m);}
整數劃分問題