代码是CSDN编译器手打的,还没测试,应该也没错。
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class 部分和 {
private static int n,k; // n个数字,组成和为k
private static int[] a; // 给的数组
private static boolean[] vis; // 判重,避免重复取
private static Set<ArrayList<Integer>> res = new HashSet<>(); // 去重,所以用Set
private static void dfs(List<Integer> now,int sum,int z,int start){
// now:当前遍历所包含的数和为sum,当前考虑数组中a[start],
// 定义出口
if(sum==k){
res.add(new ArrayList<Integer>(now));
return;
}
// 剪枝 出口
if(sum>k || z == n) return;
for(int i = start ; i < n ; i++){
if(!vis[i]){
vis[i]=true; // 前
now.add(a[i]); // 前
dfs(now,sum+a[i],z+1,i); // 递归
vis[i]=false; // 回溯处理
now.remove(now.size-1); // 回溯处理
}
}
}
public static void main(String[] args) {
// 思路:dfs
n=5;
a=new int[]{13,2,4,4,7};
vis = new boolean[n];
k=13;
dfs(new ArrayList<Integer>(),0,0,0);
System.out.println(res);
}
}