一、题目
描述给定整数a1、a2、…an,判断是否可以从中选出若干数,使它们的和恰好为K。
输入
首先,n和k,n表示数的个数,k表示数的和。
接着一行n个数。
(1<=n<=20,保证不超int范围)
输出
如果和恰好可以为k,输出“YES”,并按输入顺序依次输出是由哪几个数的和组成,否则“NO”
样例输入
4 13
1 2 4 7
样例输出
YES
2 4 7
二、实现思路及其代码
思路一:DFS深度优先搜索
(1)初始状态:对于和k,看是否能从全部元素中找到一种组合使之和等于k;
(2)平行状态:对当前元素选择要或者不要,进入下一状态;
(3)下一状态:设上一平行状态已选择ai元素,则需要对剩下的元素判断是否能找到一种组合使之和等于k-ai;
(4)若上一平行状态未选择ai元素,则需要对剩下的元素判断是否能找到一种组合使之和等于k;
……
……
(5) 若一条支路走不通(k < 0)或者一条支路搜索到底了(i == arr.length),则需回溯;
(6)YES的判断:当k 等于 0时,说明已得出一种有效组合使之和==k,按格式输出该组合即可。
/**
* 深度优先搜索
* @param arr 数组
* @param k 和
* @param current 当前判断元素
*/
static ArrayList<Integer> list = new ArrayList<>();
public static void dfs(int[] arr, int k, int current){
// 已经凑好k,输出结果
if (k == 0) {
System.out.println("Yes");
for (int i = 0; i < list.size(); i