假设有一组数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个数的所有组合(因为有重复值,所以结果肯定有重复,你可以在最后去除掉重复结果)
接下来的计算很简单了