zoukankan      html  css  js  c++  java
  • 整数拆分

     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)

  • 相关阅读:
    Linux_KVM虚拟机
    Linux_KVM虚拟机
    Python_编程特色
    Python_编程特色
    Linux_进程管理&计划任务
    Linux_进程管理&计划任务
    Linux_系统破坏性修复实验
    Linux_系统破坏性修复实验
    Linux_Shell基础
    Confluence 6 的高级 Crowd 设置
  • 原文地址:https://www.cnblogs.com/ustc-anmin/p/11235052.html
Copyright © 2011-2022 走看看