整数划分问题java实现

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
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值