整数拆分

 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)

 

posted @ 2019-07-23 22:54  Practical  阅读(1625)  评论(0编辑  收藏  举报