寻找和为Sum的多个数-1

原创 2016年09月23日 18:04:20

1. 题意

给定两个正整数,N和Sum,其中N表示 1…N这样一个由N个连续的整数数组成的序列,而Sum表示从这1…N个数中,任意取K个数,使其和为Sum,其中1<=K<=N,要求输出所有可能的组合数。

2. 解法

核心思想: 将n问题转换为n-1问题

对于这样1..N的N个数,我们可以考虑是否选择第N个数来解决,问题就可以转换成N-1个数的问题,也就是说:

1)如果我们取了第N个数,那么问题就变成了”在1..N-1这个N-1个数中,选取K个数,使得其和为Sum-N”

2)如果我们不取第N个数,那么问题就变成了”在1..N-1这个N-1个数中,选取K个数,使得其和为Sum”

对于以上分析,我们定义一个函数SumOfKValue, 其实现如下:

 /**
 * Created by ChaoNi on 2016/9/23.
 */

import java.util.*;

public class Main{

    //记录选取的数字
    private static LinkedList<Integer> arrayList = new LinkedList<>();

    public static void main(String[] args) {
         SumOfkValue(10,10);
    }

    public static void SumOfkValue(int sum, int n) {
        if (n <= 0 || sum == 0) return;

        //输出找到的结果
        if (sum == n) {
            //反转list
            Collections.reverse(arrayList);
            for (int t : arrayList) {
                System.out.print(t + " ");
            }
            System.out.print(n + "\r\n");
            Collections.reverse(arrayList);
        }

        //表示选取第N个数
        arrayList.add(0, n);
        SumOfkValue(sum - n, n - 1);
        //表示不选取第N个数
        arrayList.remove(0);
        SumOfkValue(sum, n - 1);
    }

}

3. 结果

上面的程序测试用例中N=10,Sum=10,将得到如下的输入结果
10
9 1
8 2
7 3
7 2 1
6 4
6 3 1
5 4 1
5 3 2
4 3 2 1

共有10组!

版权声明:本文为博主原创文章,未经博主允许不得转载。

算法总结(3)--k-Sum求和,找到和为定值的多个数

2Sum,3Sum,4Sum,…,nSum这类问题
  • qq_26437925
  • qq_26437925
  • 2016年10月11日 13:06
  • 1846

在数组中寻找和为指定值的两个数

题目:在数组中寻找和为指定值的两个数,如arr={,
  • heyongluoyao8
  • heyongluoyao8
  • 2014年05月11日 19:50
  • 2196

算法理解——寻找和为定值的两个数/多个数

1 寻找和为定值的两个数 题目:输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。 example:  例如输入数组1、2、4、7、11、15和数字15。由于4+11=...
  • jinyongqing
  • jinyongqing
  • 2013年09月26日 15:52
  • 4235

寻找和为Sum的多个数-2

1. 题意前一篇文章中,我们可以明显发现,其要求是一个连续的N中选取K个数使其和为Sum,这里我们可以对其举一反三,也即在一个给定的数组Arr中(注意这里不要求数组中数据是连续的),任意的从中选取K个...
  • jack_nichao
  • jack_nichao
  • 2016年09月23日 18:21
  • 156

数组去重、冒泡排序、1-100随机产生10个数、字符串中找最多出现的单个字符

数组去重 冒泡排序 1-100随机产生10个数 字符串中找最多出现的单个字符
  • moonnn_light
  • moonnn_light
  • 2017年06月29日 16:01
  • 332

【codeforces 680 C】【数学题+交互题】C. Bear and Prime 1【底数是[2,100]中的数,现在你最多询问20次,询问为这个数是不是底数的因数,最后判断这个数是不是素数】

传送门:http://codeforces.com/contest/680/problem/C 题意:底数是[2,100]中的数,现在你最多询问20次,询问为这个数是不是底数的因数,最后判断这个数是...
  • guhaiteng
  • guhaiteng
  • 2016年11月06日 23:27
  • 413

和为定值的多个数 (n问题转化为n-1问题)

/* description: 输入两个整数n和sum,从数列1,2,3.......n 中随意取几个数,使其和等于sum,要求将其中所有的可能组合列出来。方法1: 注意到取n,和不取n个区别即可,考...
  • XingKong_678
  • XingKong_678
  • 2016年03月15日 10:13
  • 517

【LeetCode-面试算法经典-Java实现】【001-Two Sum(求两个数的和)】

给定一个整数数组,找出其中两个数满足相加等于你指定的目标数字。要求:这个函数twoSum必须要返回能够相加等于目标数字的两个数的索引,且index1必须要小于index2。请注意一点,你返回的结果(包...
  • DERRANTCM
  • DERRANTCM
  • 2015年07月16日 06:39
  • 7312

HDU 1024 Max Sum Plus Plus求前n个数中的若干个数分为连续的m段的最大和值(解析)

HDU 1024 Max Sum Plus Plus求前n个数中的若干个数分为连续的m段的最大和值(解析)...
  • CSDN568302203
  • CSDN568302203
  • 2016年04月20日 07:37
  • 504

【LeetCode-面试算法经典-Java实现】【016-3 Sum Closest(最接近的三个数的和)】

【016-3 Sum Closest(最接近的三个数的和)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Given an array S of n integers, ...
  • DERRANTCM
  • DERRANTCM
  • 2015年07月21日 07:22
  • 2500
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:寻找和为Sum的多个数-1
举报原因:
原因补充:

(最多只允许输入30个字)