从1-n个数取若干个数,使和为m,问多少种情况

其实运用了背包问题的思想,假设对这个问题建立了函数:f(m,n)

从n个数中取:有两种情况

n不在这若干个数中,f(m,n-1)

n在这若干个数中,f(m-n,n-1)

所以 f(m,n)=f(m,n-1)+f(m-n,n-1)

根据上式,应用递归的思想,编程如下:

public class Test1 {
public static void main(String[] args) throws Exception {
    Test1 test=new Test1();
   System.out.println(test.fun(6,5));            
 
}
public int fun(int m,int n){
     if(n<1||m<1) {
        
      return  0;
        
     } if(m<n) {//如果最大值为m
         n=m;
         return fun(m,m-1)+1;
        
     }if(m==n|m==1) {
         return 1;
     }
    return fun(m,n-1)+fun(m-n,n-1);
}
}

原文地址:https://www.cnblogs.com/yxj808/p/11974206.html

时间: 2024-11-16 19:03:58

从1-n个数取若干个数,使和为m,问多少种情况的相关文章

输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m 转载

题目:编程求解,输入两个整数n和m,从数列1,2,3,--n中随意取几个数,使其和等于m.要求将所有的可能组合列出来. 分析:分治的思想.可以把问题(m,n)拆分(m - n, n -1)和(m, n - 1). 注意点:1.n大于m时,可直接从n = m出开始搜索 2.结束条件:n < 1 || m < 1 3.打印输出结果.注意打印输出结果并不代表函数调用结束,以n = 7 和 m = 10为例,7.3和7.2.1都是一种结果,不能得到7.3的时候终止.打印输出的条件是n = m 程序代码

如何从一堆数中选出若干个数,使其和等于给定的数?

如题,比如有一堆数:13,2,4,2,4,8,7,8,6 要从中挑选出若干个数,使得它们的和等于32,挑选出来的数是:20,6,4,2 我是使用“试探”法来解这个题目,思路如下: 先对数进行排序:13,8,8,7,6,4,4,2,2 选出最大的数字,以及不大于目标数字后续数字,于是我挑选到了13,8,8,其和是29,如果这个时候再挑选7的话就会超过32,所以就跳过,尝试在后面找到合适的数字,找到4,加上仍然大于32,再接着找到2,这次好了,加起来是31. 再次向后面寻找小的数字的时候,发现没有合

排列组合问题:n个数中取k个数

/************************************有0~n-1共n个数,从其中任取k个数,*已知这k个数的和能被n整除,求这样的*k个数的组合的个数sum,*输入:n,k*输出:符合条件的个数sum************************************/ #include <malloc.h>#include <iostream>#include <stdio.h>using namespace std; int k, *a,

牛牛想对一个数做若干次变换,直到这个数只剩下一位数字。 变换的规则是:将这个数变成 所有位数上的数字的乘积。比如285经过一次变换后转化成2*8*5=80. 问题是,要做多少次变换,使得这个数变成个位数。

牛牛想对一个数做若干次变换,直到这个数只剩下一位数字.变换的规则是:将这个数变成 所有位数上的数字的乘积.比如285经过一次变换后转化成2*8*5=80.问题是,要做多少次变换,使得这个数变成个位数. 输入描述: 输入一个整数.小于等于2,000,000,000. 输出描述: 输出一个整数,表示变换次数. 输入例子: 285 输出例子: 2 1 #include<stdio.h> 2 #include<stdlib.h> 3 int main() 4 { 5 int n; 6 sc

使用条件运算符取3个数中不大不小的那个数

使用条件运算符取3个数中不大不小的那个数,若a.b.c为3个不相等的整数,m为要求的a.b.c中不大不小的那个数,则可以使用下面的表达式: m = a>b?b>c?b:a>c?c:a:a>c?a:b>c?c:b;   如果使用if-else结构,等效代码如下: if(a>b){ if(b>c){ m = b; }else{ if(a>c){ m = c; }else{ m = a; } } }else{ if(a>c){ m = a; }else{ i

随便取十个数1

Private Sub comman1 -Click() Dim i As Integer Dim a(10) As Integer Dim sum As Integer Randomize For i=1 To 10 a(i)=Int(Rnd*1000)+1 sum=sum+a(i) Next i Print sum End Sub 这是我做随便取十个数的第一个VB语言程序,我在上机课的时候操作出来了,但是由于那时候进不了,所以就没有写博客,现在补回来了.只是缺少了图片.

获取最大值:输入 若干个数,打印最大值,输入为空,退出程序(空的方式,以及int的应用)

1 ''' 2 获取最大值:输入 若干个数,打印最大值,输入为空,退出程序 3 ''' 4 # 第一版 5 6 # 为空,这里用 '' "" '''''' 中间什么都不加 7 # 先输入第一个值,作为目前最大的值 8 # 因为输入若干个数,不知道循环次数,所以用 while循环 9 if __name__ == '__main__': 10 num1 = input('>>') 11 if num1 != '': # '' "" '''''' 都是空 1

用三元运算符比较两个整数是否相等以及取三个数中的最大值

1.比较两个整数是否相等: class Hello2 { public static void main(String[] args) { int x = 10; int y = 5; boolean b = (x == y) ? true : false; System.out.println("b = " + b); } } 结果: true : false可以省略,因为(x = y)这个判断的结果不是true就是false. 2.取三个数中的最大值: class Hello2 {

华为初级——字符个数统计(三种情况)

第一种情况: 描述:写出一个程序,接受一个有字母和数字组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数.不区分大小写. 知识点:字符串,函数,指针   题目来源:内部整理   练习阶段:初级   运行时间限制:10Sec  内存限制:128MByte  输入:输入一个有字母和数字组成的字符串,和一个字符.   输出:输出输入字符串中含有该字符的个数.  样例输入: ABCDEF A                    样例输出: 1 源程序: #include<iostream>