输入m和n(20≥m≥n≥1)求出满足以下方程式的正整数数列i1,i2,…,in,使得:i1+i2+…+in=m,且i1≥i2≥……≥in

功能:
  * 输入m和n(20≥m≥n≥1)求出满足以下方程式的正整数数列i1,i2,…,in,使得:i1+i2+…+in=m,且i1≥i2≥……≥in。
  * 原型: 当n=4,m=8时,将得到如下5个数列: 5 1 1 1 , 4 2 1 1 , 3 3 1 1 , 3 2 2 1 , 2 2 2 2
  * int GetSeriesNum(int m, int n); 输入参数: int m:20≥m≥n≥1 int n:20≥m≥n≥1 返回值:
  * 满足i1+i2+…+in=m,且i1≥i2≥……≥in条件的数列的数量

package com.caoliang.test;

import java.util.Arrays;
public class Test {
 int count = 0;
 int[] k = new int[20];
 public int getNumbles(int m, int n) {
  
  int i, j, d = 0;
  if ((m >= n) && (n > 0) && (m <= 20)) {
   if (n == 1) {
    System.out.println("m="+m);
    k[0] = m;
    System.out.println("========"+Arrays.toString(k));
    d = 0;
    for (j = 0; k[j]!=0; j++) {
     if (k[j + 1] > k[j]) {
      d = 1;
     }
    }
    if (d == 0) {
     count++;
    }
   } else{
    //每组数的最后一位数字肯定是小于等于m/n的,
    for (i = 1; i <= m / n; i++) {
     //给数组的最后一位赋值
     k[n - 1] = i;
     //由于递归,n-1的值在不停的减1,所以这个式子的结果是n=1开始计算
     getNumbles(m - i, n - 1);
     
    }
   }
    
  }else{
   return 0;
  }
  return count;
 }

 public static void main(String[] args) {
  Test test = new Test();
  int res1 = test.getNumbles(8, 4);
  // int res2 = test.getNumbles(6, 6);
  System.out.println("res1=" + res1);

 }
}



 

猜你喜欢

转载自blog.csdn.net/caoliang0921/article/details/8913803