整數拆分


 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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM