Java 如何从大小为n的数组中创建大小为k的所有可能子集(无重复)?

Java 如何从大小为n的数组中创建大小为k的所有可能子集(无重复)?,java,permutation,Java,Permutation,所以我有一系列的双打。我想在这个大小为k的数组中找到一个子集,并将所有不在该子集中的子数组存储到不同的子数组中。我想对所有可能的子集都这样做,不要重复 最好的方法是什么 double[]样本={ 1.0, 3.0, 1.6, 2.1, 2.5, 2.7, 2.3, 1.5, 1.1, 0.5, 2.0, 2.0, 1.2, 1.2, 1.3, 0.5, 1.4, 2.4 }; 公共静态void main(字符串[]args){ ArrayListlist=新的ArrayList(); doub

所以我有一系列的双打。我想在这个大小为k的数组中找到一个子集,并将所有不在该子集中的子数组存储到不同的子数组中。我想对所有可能的子集都这样做,不要重复

最好的方法是什么

double[]样本={
1.0, 3.0, 1.6, 2.1, 2.5, 2.7, 2.3, 1.5, 1.1, 0.5, 2.0, 2.0, 1.2, 1.2, 1.3, 0.5, 1.4, 2.4
};
公共静态void main(字符串[]args){
ArrayListlist=新的ArrayList();
double[]noo=选取随机数(样本);
如果(!list.contains(noob)){//这里我想确保它是唯一的子集
添加(noob);
对于(双a:noob){
系统输出打印(a+“”);
}
System.out.println(“”);
}
}
公共静态double[]pickNRandom(double[]lst){//查找随机子集
双[]i=lst;
Collections.shuffle(Arrays.asList(i));
双[]鳍={
i[0],i[1],i[2],i[3],i[4],i[5],i[6],i[7]
};
回流翅片;

}
我推荐两种可能的方法来解决这个问题,这是子集和问题(一个无法在多项式时间内解决的NP完全问题)的一种变体。这两种方法是:

  • 救援
  • 动态规划

递归方法更容易理解,但动态规划方法更高效、更优雅。我建议查看站点,调整解决方案以适应您的问题(而不是求和,将子集添加到子数组中)。

以下是一种递归方法,用于为给定整数数组创建一组所有k个子集:

import java.util.ArrayList;

public class Solution {
    public static void ksubsets(int[] arr, int left, int idx,
                                ArrayList<Integer> curArr, ArrayList<ArrayList<Integer>> result) {
        if (left <= 0) {
            ArrayList<Integer> tmp = new ArrayList<>(curArr);
            result.add(tmp);
            return;
        }
        for (int i = idx; i < arr.length; i++) {
            curArr.add(arr[i]);
            ksubsets(arr, left - 1, i + 1, curArr, result);
            curArr.remove(curArr.size() - 1);
        }
    }

    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4};
        int left = 3; // specifies the subset size
        int idx = 0;
        ArrayList<Integer> curArr = new ArrayList<>();
        ArrayList<ArrayList<Integer>> result = new ArrayList<>(); // contains all calculated subsets
        Solution.ksubsets(arr, left, idx, curArr, result);
        System.out.println(result.size());
    }
}
import java.util.ArrayList;
公共类解决方案{
公共静态无效k子集(int[]arr,int left,int idx,
ArrayList(ArrayList结果){

如果(左)到目前为止,您尝试了什么方法?以下是一个很好的起点: