整数拆分
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)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步