求递归算法,求M个数中任意N个数相加等于S(N是一个变量,不固定)

假设有一组数100, 100, 81, 96, 100, 100, 122,任意3个相加等于322
都知道只简单的用三个for 循环可以求解

但当这个N值不再是固定的时(有可能下次是求N=4 个值相加等于377)

要如何实现这一算法?

思路有,但是技术尚浅只能靠你自己了,这个问题其实主要是拿到n个数的组合,那么我们其实是可以去拿到n个数的组合再去判断这n个数的组合加起来是否等于最终值

https://zhidao.baidu.com/question/440620852.html?qbl=relate_question_1
这里写了两种获取组合的方法 一种递归算法、一种回溯算法。

 package com.project.GetNNumCount;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.TreeSet;

public class getNNumCount {
    private static int NUM = 0;

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("请输入X个数,用逗号分割:");
        String str = input.nextLine();
        String[] datas = str.split(",");
        System.out.println("请输入数字Y:");
        NUM = input.nextInt();
        if (NUM > datas.length) {
            System.out.println("输入的Y必须小于等于X!");
            return;
        }
        combine(Arrays.asList(datas));
    }

    private static void combine(List<String> datas) {
//        TreeSet<String> set = new TreeSet<String>();
//        for(String str : datas) {
//            set.add(str);
//        }

        ArrayList<List<String>> subset = getSubset(datas);

        for(List<String> ts : subset) {
            System.out.println(ts);
        }
    }

    public static String[] getBinaryValue(List<String> datas) {
        int size = datas.size();
        int m = (int) Math.pow(2, size) - 1;
        String[] result = new String[m + 1];
        for (int i = m; i > -1; i--) {
            StringBuffer sb = new StringBuffer(Integer.toBinaryString(i));
            int length = sb.length();
            if (length < size) {
                for (int j = 0; j < size - length; j++) {
                    sb.insert(0, "0");
                }
            }
            result[i] = sb.toString();
        }
        return result;
    }

    public static ArrayList<List<String>> getSubset(List<String> datas) {
        ArrayList<List<String>> result = new ArrayList<List<String>>();
        String[] items = new String[datas.size()];
        int i = 0;
        for (String item : datas) {
            items[i++] = item;
        }
        String[] binaryValue = getBinaryValue(datas);
        for (int j = 0; j < binaryValue.length; j++) {
            String value = binaryValue[j];
            List<String> subset = new ArrayList<String>();
            for (int k = 0; k < value.length(); k++) {
                if (value.charAt(k) == '1')
                    subset.add(items[k]);
            }
            if(subset.size() == NUM)
                result.add(subset);
        }

        return result;
    }
}

这是求m个数 取n个数的所有组合(因为有重复值,所以结果肯定有重复,你可以在最后去除掉重复结果)
接下来的计算很简单了