1.组合




java
package siyangyuan;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* Class Name :zuhe
* Package :siyangyuan
* Description:
*
* @Author: Mr.chunxugao
* Create: 2026-03-14- 19:24
* @Version:v1.0
*/
public class zuhe {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 2. 提示输入 & 读取数字
System.out.print("请输入数字 n(范围 1~n):");
int n = sc.nextInt();
System.out.print("请输入数字 k(每组 k 个数):");
int k = sc.nextInt();
List<List<Integer>> result= combine(n,k);
// 4. 输出最终结果
System.out.println(n + " 中选 " + k + " 个的所有组合:");
System.out.println(result);
}
public static List<List<Integer>> combine(int n,int k){
List<List<Integer>> res=new ArrayList<>();
List<Integer> path=new ArrayList<>();
backtrack(n,k,1,res,path);
return res;
}
public static void backtrack(int n,int k,int start, List<List<Integer>> res,List<Integer> path) {
//如果到了路径的长度,就添加并且返回
if(path.size()==k){
res.add(new ArrayList<>(path));
return;
}
//
for(int i=start;i<=n;i++){
path.add(i);
backtrack(n,k,i+1,res,path);
path.remove(path.size()-1);
}
}
}
子集
java
package siyangyuan;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* Class Name :ziji
* Package :siyangyuan
* Description:
*
* @Author: Mr.chunxugao
* Create: 2026-03-14- 22:24
* @Version:v1.0
*/
public class ziji {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入数组长度:");
int n=sc.nextInt();
System.out.println("请输入数组元素(空格分隔):");
int[] nums=new int[n];
for (int i=0;i< nums.length;i++){
nums[i]=sc.nextInt();
}
List<List<Integer>> result= subset(nums);
System.out.println("子集为");
System.out.println(result);
}
//求子集
public static List<List<Integer>> subset(int[] nums ){
List<List<Integer>> res=new ArrayList<>();
List<Integer> path=new ArrayList<>();
backTarck(nums,0,res,path);
return res;
}
private static void backTarck(int[] nums , int start,List<List<Integer>> res,List<Integer> path) {
// 【唯一和组合不同的地方】
// 组合:只有长度=k才存
// 子集:每一步都存!(空集、1个、2个...全要)
res.add(new ArrayList<>(path));
for (int i = start; i < nums.length; i++) {
//加入
path.add(nums[i]);
backTarck(nums,i+1,res,path);//探索
//回退
path.remove(path.size()-1);
}
}
}


