关闭

寻找和为Sum的多个数-1

标签: 数组
219人阅读 评论(0) 收藏 举报
分类:

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组!

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:8348次
    • 积分:325
    • 等级:
    • 排名:千里之外
    • 原创:24篇
    • 转载:1篇
    • 译文:0篇
    • 评论:2条
    文章分类