整数拆分
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)