部分和问题用深度优先来解答
给定整数a1、a2、…an,判断是否可以从中选出若干数,使它们的和恰好为K。
输入
首先,n和k,n表示数的个数,k表示数的和。
接着一行n个数。
(1<=n<=20,保证不超int范围)
输出
如果和恰好可以为k,输出“YES”,并按输入顺序依次输出是由哪几个数的和组成,否则“NO”
输入样例
4
1 2 4 7
13
输出样例
YES 13 = 2 + 4 + 7
大体的思路是,每个数组中的数字都有两种选择方式,选择与不选择,一次递归就可以了。
放代码
import java.util.*;
public class 部分和 {
static int k;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
List<Integer> list = new ArrayList<>();
int n = sc.nextInt();
int a[] = new int[n];
for (int i = 0; i < n; i++) {
a[i] = sc.nextInt();
}
k = sc.nextInt();
dfs(a, k, 0, list);
}
private static void dfs(int[] a, int e, int i, List<Integer> lis) {
int w = i;
if (e == 0) {
System.out.print("YES" + " "+k + " =" + " ");
for (int j = 0; j < lis.size(); j++) {
System.out.print(lis.get(j) + (j == lis.size() - 1 ? "" : " + "));
}
System.out.println();
System.exit(0);
}
if (e < 0 || i == a.length) {
return;
}
dfs(a, e, i + 1, lis);
lis.add(a[i]);
int index = lis.size() - 1;
dfs(a, e - a[i], i + 1, lis);
lis.remove(index);
}
}