输入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);

 }
}



 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这是一个求满足条件的整数序列 i1, i2, …, in 的程序。输入要求 m 和 n(20≥m≥n≥0),并且要求输出满足 i1+i2+…+in=m 且 i1i2≥…≥in 的整数序列。例如,当 n=4,m=8 时,可以得到如下 5 个序列: (2, 2, 2, 2) (3, 2, 2, 1) (4, 2, 1, 1) (4, 3, 1, 0) (4, 4, 0, 0) ### 回答2: 满足特定条件数列是一种非常有用的数学工具,可以被广泛地应用于数学、物理、工程等领域。本题中,我们需要找出一组特定的正整数数列满足给定的条件,即这些数相乘等于m,且这些数按降序排序后的结果为给定n。这是一个经典的组合数学问题,有多种求解方法。 一种基于递归的求解方法比较直观易懂。首先,我们定义一个递归函数,该函数接收三个参数:当前要搜索的数值,当前的积,以及还需找到的数值的数量。在每次递归调用中,我们根据当前的数值和积,计算出还需要找到的数值的数量,以及最小可能的下一个数值,并验证当前的数值是否符合条件。如果符合条件,则将其加入结果数组中,并递归调用该函数,继续搜索更小的数值。直到找到所有符合条件数列为止。 代码如下: ```python def search(start, prod, remain, res): if remain == 0: if prod == m: res.append(seq[:]) return if prod > m or prod * (n-remain+1) > m: return for i in range(start, 0, -1): seq[n-remain] = i if prod * i > m: break search(i, prod*i, remain-1, res) # 主程序 m, n = map(int, input().split()) seq = [0] * n res = [] search(m, 1, n, res) for s in res: print(" ".join(str(x) for x in s)) ``` 在上面的程序中,我们使用了一个seq数组来保存当前的搜索结果。另外,我们使用了一个res数组来保存所有符合条件的搜索结果。在搜索函数中,我们使用了一些剪枝策略,以减少搜索空间。比如,如果当前的积prod已经大于m了,那么后续的搜索就不必进行了,因为即使找到符合条件数列,其积也不可能等于m。又比如,如果当前的积乘上还需要找到的数字的个数小于m,那么后续的搜索也可以省略,因为即使将后续的数字都取最小值,其积也无法达到m。 最终,我们将搜索到的结果按照格式输出即可。对于本题的样例,我们的程序输出结果如下: ``` 8 4 2 1 1 4 2 2 4 4 2 2 2 2 ``` ### 回答3: 题目要求给定正整数m和n,寻找一组正整数数列i1,i2,...,in,使得它们的乘积等于m,且i1>=i2>=...>=in。这里需要用到数学中的组合数学知识。 我们可以先考虑一下如何得到数列中的第一个数i1,因为i1是整个数列中的最大值,所以我们可以将m分解成若干个i1相乘的形式,即m=k*i1,则k为正整数i1为第一个数。为了满足题目中要求的数列单调不降,我们需要让第二个数i2的取值范围在[1,i1-1]之间。因为当i2=1时,数列不能保持单调不降,当i2>=i1时,i1不是数列中的最大值,同样不能满足要求。所以,i2的取值范围为[1,i1-1]。 同理,根据i1i2的取值,我们可以将m=k*i1*i2分解成若干个i3相乘的形式,i3的取值范围为[1,i2-1],以此类推。当i(n-1)=1时,i(n)的取值不能超过m的值,否则就不能满足i1*i2*...*in=m的条件了。 因为题目中要求数列是单调不降的,所以我们可以使用递归的方法来求解。具体思路如下: 在递归函数中,首先计算出k=i1*i2*...*in,如果k等于m,则找到了一组满足要求的数列,将其保存下来,并返回上一级递归函数。如果k小于m,则从i(n-1)到1枚举每个数,对于每次枚举,再递归求解i(n-2)到1的取值。直到求解出i1。在递归调用结束后,回到调用此递归函数的上一级递归函数,继续从i(n-2)开始枚举求解。递归调用结束条件是当剩余的数列长度为1时,直接将剩余的数字作为数列的最后一个元素即可。 最后,将递归求解得到的数列按照从大到小的顺序输出即可。 总之,通过递归枚举i1到in的可能取值,并用剩余的数值递归求解i2到in,i3到in...in,最终可以求解出所有可能的数列。时间复杂度为O(m^n)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值