java求子集和,給定陣列求這個陣列中某些數字相加等於某個值的所有可能集合
阿新 • • 發佈:2019-02-08
先說明這只是一種寫法,演算法很多,歡迎評論區有更多的寫法
網上百度資料 都說什麼窮舉、回溯之類的 但是沒有一個直接給答案的,很煩,但是我這個沒有詳細優化,只是為了實現,陣列太大就需要優化 直接上程式碼 不多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