部分和 dfs
给定一个序列a1,a2…,an判断是否可以从中选出若干个数,使它们的恰好为k,
1<=n<=20
-108<=ai<=108;
-108<=K<=108;
样例:
输入
n=4
a={1,2,4,7}
k=13
输出
Yes(13=2+4+7)
import java.util.*;
public class _部分和 {
public static int kk;//用了拷贝k的
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
int arr[] = new int[n];
for (int i = 0; i < arr.length; i++) {
arr[i]=sc.nextInt();
}
int k=sc.nextInt();
kk=k;
//arr是数组 k是还要组合的数量 0是当前选择的状态 ArrayList是用来保存选择的数字的
dfs(arr,k,0,new ArrayList<Integer>());
}
private static void dfs(int[] arr, int k, int cur, ArrayList<Integer> arrayList) {
if(k==0) {//刚好可以组合
System.out.print("Yes("+kk+"=");
for (int i = 0; i <arrayList.size(); i++) {
System.out.print(i==arrayList.size()-1?arrayList.get(i)+")":arrayList.get(i)+"+");
}
}
if(k<0||cur==arr.length)return;//组合的数量小于0或者是没有可以选择的了退出
//不进行选择
dfs(arr, k, cur+1, arrayList);//可选择的范围小了一个
//进行选择
arrayList.add(arr[cur]);
int index = arrayList.size()-1;//拷贝它添加下标的位置
dfs(arr, k-arr[cur], cur+1, arrayList);
arrayList.remove(index);
}
}