1. 程式人生 > >整數劃分問題java實現

整數劃分問題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