【题目描述】

整数划分问题是算法中的一个经典命题之一

整数划分,是指把一个正整数n如下如下形式:

n = n1 + n2 + … + nk (其中 n1 >= n2 … >= nk > 0, k >= 1)


【示例】

例如整数4:

4 = 4

4 = 1 + 3

4 = 2 + 2

4 = 2 + 1 + 1

4 = 1 + 1 + 1 + 1

说明:"4 = 1 + 3" 和 "4 = 3 + 1" 是同一个组合


【代码】

import java.util.*;

public class Solution {
public static void main(String[] args) {
int m = 4;
int n = 4;
System.out.println(getEqualNum(m, n));
}

/**
* @param m 假设有M个苹果
* @param n 目的是需要把M个苹果放在N个盘子上
* @return 排列组合的个数
*/
private static int getEqualNum(int m, int n) {
// 如果只有1个盘子 或者 只有1个苹果 总共也就一种方案
if (m <= 1 || n <= 1){
return 1;
} else if( m < n){
// 如果盘子比苹果多, 拿走多余的盘子也没影响
return getEqualNum(m, m);
}else{
// 如果苹果比盘子多 或者 一样多 :
// 不存在空盘,每个盘子放1个, 盘子满了 (m - n, n)
// 存在空盘,则至少1个空盘, (m, n - 1)
return getEqualNum(m - n, n) + getEqualNum(m, n - 1);
}

}
}


学习参考:

​https://blog.51cto.com/ruochen/5449493?articleABtest=0​