![](https://img-blog.csdnimg.cn/20201027213435207.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1bm5ubmg=,size_16,color_FFFFFF,t_70)
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static int n; //元素个数
static int[] a; //元素数组
static int k; //需得到的数字
static ArrayList<Integer> res = new ArrayList();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
a=new int[n];
for(int i=0;i<n;i++) {
a[i]=sc.nextInt();
}
k=sc.nextInt();
Arrays.sort(a);
dfs(k,0);//求和k,从数组a的第一个元素开始查找
}
/*
* x:当前需要得到的和
* cur:当前加入的元素a[cur]
* (1)如果当前x<0 或者 下标cur==数组a的长度,就结束
* (2)有两种选择
* 1.不要当前的元素a[cur]
* 递归调用dfs(x,cur+1);
* 2.要当前的元素a[cur]
* 先将当前元素加入列表(记录合法路径);
* 再递归调用dfs(x-a[cur],cur+1);
* 将当前元素移出列表(不合法回溯)
*
* */
private static void dfs(int x,int cur) {
if(x==0) {//出口
System.out.print("YES ("+k+"=");
for(int i=0;i<res.size();i++) {//打印
System.out.print(res.get(i)+(i!=(res.size()-1)?"+":")"));
}
System.exit(0);
}
if(x<0 || cur==a.length) {
return;
}
//(1)不要当前的元素a[cur]
dfs(x,cur+1);
//(2)要当前的元素a[cur]
res.add(a[cur]);//要该元素,加入列表
int index = res.size()-1;//当前加入元素的下标
dfs(x-a[cur],cur+1);
res.remove(index);//回溯
}
}
![](https://img-blog.csdnimg.cn/20201028075935272.png)