输入两个整数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

程序代码如下:

public class FindSum {
    // used as a stack to save the result
    private static LinkedList<Integer> list = new LinkedList<Integer>();

    public static void findSum(int sum, int n) {
        if (n < 1 || sum < 1)
            return;
        if (sum < n)
            n = sum;
        if (sum == n) {
            for (int i = 0; i < list.size(); i++)
                System.out.print(list.get(i) + " ");
            System.out.print(sum);
            System.out.println();
        }

        list.addLast(n);
        findSum(sum - n, n - 1);
        list.removeLast();
        findSum(sum, n - 1);
    }

    public static void main(String[] args) {
        int sum = 10;
        int n = 8;
        findSum(sum, n);
    }
}
时间: 2024-12-12 16:14:44

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

两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数, 使其和为 m

/* 输入两个数m和n ,从数列1,2,3,4,.....n这些数中挑选几个 使得和为m,找出所有的这样的组合 */ void FindSum(int m,intn,vector<int>& vec) { if(m < 0 || n < 0) return ; if(m == 0) { vector<int>::iterator itr = vec.begin(); for(;itr != vec.end();itr++) cout<<*itr<

编程求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来

import java.util.LinkedList; import java.util.Scanner; public class Main { private static LinkedList<Integer> list = new LinkedList<>(); public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext(

输入两个整数,放入到a与b变量中去,如果a&gt;b就将a与b中的值进行交换,否则就不交换。

import java.util.Scanner; /** * @author 蓝色以太 输入两个整数,放入到a与b变量中去,如果a>b就将a与b中的值进行交换,否则就不交换. */ public class Change { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入两个整数:"); int a = sc.nextInt

c语言:输入两个整数m和n,计算需要改变m的二进制表示中的多少位才能得到n

输入两个整数m和n,计算需要改变m的二进制表示中的多少位才能得到n? 解:第一步求这两个数的异或运算,将异或运算结果存起来:第二步统计这个运算结果当中1的位数 程序: #include<stdio.h> int count(int m,int n) { int t,count=0; t = m^n; while (t) { count++; t=t&(t-1); } return count; } int main() { int num1,num2,ret=0; printf(&qu

【C语言】用函数指针变量完成:输入两个整数,让用户选择函数,选择1输出较大的数,选择2输出较小的数

<pre name="code" class="cpp">//用函数指针变量完成:输入两个整数,让用户选择函数,选择1输出较大的数,选择2输出较小的数 #include <stdio.h> int max(int x,int y) { return (x>y)?x:y; } int min(int x,int y) { return (x>y)?y:x; } int main() { int (*p)(int,int); int

输入两个整数m和n,计算m需要改变多少位才能得到n

题目:输入两个整数m和n,计算m需要改变多少位才能得到n? 解析: 这个题我最开始是没有思路的,想了很久才有点思路,思路的来源是把他们转化成二进制后才有的 例如:(5)的二进制:0101  (3)的二进制:0011 如果要把5变成3的话,需要改变:2次,因为第一位0和最后一位1都相同 所以不需要改变,做法,先将两个数异或,然后求异或后1的个数 int GetCount(int N,int M) { int value=N^M;//先将两个数异或 int count=0; while(value)

输入两个整数,要求输出其中值较大者。要求用函数来找大数。

/* p176 例7.2 输入两个整数,要求输出其中值较大者.要求用函数来找大数. (1)函数名:应是见名知意,反应函数的功能,今定名为max (2)函数的类型:由于给定的两个数是整数,显然其中大者也是整数,也就是说max函数的值(即返回主调函数的值)应该是整型. (3)max函数的参数个数和类型:max函数应当有两个参数,以便从主函数接受两个整数,显然,参数的类型应当是整型. 在调用max函数时,应当给出两个整数作为实参,传给max函数中的两个形参*/ //编写程序: //(1)先编写max函

输入两个整数a和b,计算a+b的和

//此题是输入多组数据 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { int a = scanner.nextInt(); int b = scanner.nextInt(); int c = a + b; System.out.p

JS写一个简单的程序,输入两个整数,打印这两个数的和,差,积,余数

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <input type="test"  id="n1" value="" /> <input type="test"  id=&