题目描述
- 给定整数序列a1,a2,…,an,判断是否可以从中选出若干数,使它们的和恰好为k。
解析
- 采用深搜思想:每次抉择,选or不选当前元素,并以此穷举所有可能,并在穷举过程中,进行“剪枝”。
代码
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n = scanner.nextInt();
int[] a=new int[n];
for (int i = 0; i < n; i++) {
a[i]=scanner.nextInt();
}
int k=scanner.nextInt();
solve(a,n,k);
}
private static void solve(int[] a, int n, int k) {
int cur=n-1;
Arrays.sort(a);
dfs(a,k,cur,new ArrayList<Integer>());
}
private static void dfs(int[] a, int k, int cur,ArrayList<Integer> ints) {
if(k==0) {
System.out.println("yes"+ints.toString());
System.exit(0);
}
if(cur<0||k<0)
return;
ints.add(a[cur]);
dfs(a, k-a[cur], cur-1,ints);
ints.remove(ints.size()-1);
dfs(a, k, cur-1,ints);
}