版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34203492/article/details/78748436
先说明这只是一种写法,算法很多,欢迎评论区有更多的写法
网上百度资料 都说什么穷举、回溯之类的 但是没有一个直接给答案的,很烦,但是我这个没有详细优化,只是为了实现,数组太大就需要优化 直接上代码 不多BB
public static void main(String[] args) {
int[] arr = new int[10];
for(int i = 0; i < 10; i++){
arr[i] = (int)(Math.random()*100);
}
System.out.println(Arrays.toString(arr));
Test test = new Test();
test.getsubset(arr, 100, 0);
}
LinkedList<Integer> list = new LinkedList<>();
private int getsum(LinkedList<Integer> list) {
int sum = 0;
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()){
sum += iterator.next();
}
return sum;
}
private void getsubset(int[] a, int m, int i) {
while (i < a.length) {
list.add(a[i]);
if (getsum(list) == m) {
System.out.println(list);
}
i++;
getsubset(a, m, i);
list.remove(list.size() - 1);
}
}
下面贴上我在项目使用的工具类
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
/**
* 给定数组,求子集和相加等于某个给定的数
*/
public class Subset {
private static List<Integer> list = new ArrayList<>();
public static List<List<Integer>> getSubset(int[] a, int m, int i) {
List<List<Integer>> resList = new ArrayList<>();
while (i < a.length) {
list.add(a[i]);
if (getsum(list) == m) {
resList.add(list);
return resList;
}
i++;
getSubset(a, m, i);
list.remove(list.size() - 1);
}
return resList;
}
private static int getsum(List<Integer> list) {
int sum = 0;
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()){
sum += iterator.next();
}
return sum;
}
public static void main(String[] args) {
int[] arr = {6,6,6,6};
System.out.println(Arrays.toString(arr));
System.out.println(Subset.getSubset(arr, 18, 0));
}
}
原创:影公子 ——转载请注明原帖链接
———————-Java技术学习交流群467047721
点击链接加入群【Java技术学习交流群】:https://jq.qq.com/?_wv=1027&k=48DlKMY