整數劃分問題java實現
阿新 • • 發佈:2019-01-27
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