public class IntegerDivision {
public static void main(String[] args) {
//整数划分问题,将n划分为最大数不超过m的整数之和可能的组合个数
System.out.println(q(6,6));
}
/**
* 将n划分为最大整数不超过m的组合
* @param n要划分的整数
* @param m
* @return可能的组合个数
*/
public static int q(int n,int m) {
//将1划分为不超过1的整数组合只有一种
if(n==1||m==1) {
return 1;
}
//不超过0的组合个数为0或者0不能被划分
if(n<=0||m<=0) {
return 0;
}
//不超过m(m>n)事实上等价于不超过n本身
if(m>n) {
return q(n,n);
}
//不超过n的组合可以分为等于n(只有1种)和不超过n-1的组合
if(m==n) {
return q(n,m-1)+1;
}
//n>m>0的情况,可以分为不超过m-1的组合以及最大整数刚好等于m的组合(等价于将n-m划分为最大整数不超过m的个数)
return q(n,m-1)+q(n-m,m);
}
}
例如将6划分为最大整数不超过6的情况
1)6=6+0
2)6=5+1
3)6=4+2 6=4+1+1
4)6=3+3 6=3+2+1 6=3+1+1+1
5)6=2+2+2 6=2+2+1+1 6=2+1+1+1+1
6)6=1+1+1+1+1+1