int caculate(int m){ int[][] a = new int[m+1][m+1]; for (int i = 1; i <= m; i++) for (int j = 1; j <= m; j++) { if (i == 1 || j == 1) a[i][j] = 1; else { if (i == j) a[i][j] = a[i][j - 1] + 1; else if (i < j) { a[i][j] = a[i][i]; } else { a[i][j] = a[i - j][j] + a[i][j - 1]; } } } return a[m][m]; }
思路如下:
所謂整數拆分就是將一個正整數寫成如下形式:
n = m1+m2+m3+…mi(1<=mi<=n) 則稱{m1,m2,…,mi}為n的一個划分,
{m1,m2,m3,…mi}中任意值不能大於m,我們把這稱之為n的m划分,記作f(n,m)。
那么對於f(n,m)我們有以下幾種情況討論:
1.當n == 1時 f(1,m)只有一種划分即{1}。
2.當m == 1時,f(n,1)只有一種划分{1,1,…,1}。
3.當 n == m時又可以分為兩種情況:
I.划分中包括m,那么划分情況只有一種即n自己{n}
II.划分中不包括m,那么划分情況為f(n,m-1)
可得f(n,m) = f(n,m-1)+1。
4.當 n “<” m時,f(n,m) = f(n,n),因為划分中不可能出現負數。
5.當n>m時可以分為以下幾種情況:
I.包含m的划分{m,{x1,x2,x3…,xi}} 其中{x1,x2,x3,…xi}的和為n-m,因為其中可能再次出現m,所以其划分可以是f(n-m,m)的划分
II.不包含m的划分即f(n,m-1)
所以總體划分為 f(n-m,m)+f(n,m-1)