题目描述
给定整数序列a1,a2,…,an,判断是否可以从中选出若干数,使它们的和恰好为k.
输入
n=4
a={1,2,4,7}
k=13
输出
Yes (13 = 2 + 4 + 7)
代码
static int kk = 0;
public static void main(String[] args) {
Scanner kb = new Scanner(System.in);
int n = kb.nextInt();
int a[] = new int[n];
for (int i = 0; i < a.length; i++) {
a[i] = kb.nextInt();
}
int k = kb.nextInt();
kk = k;
dfs(a, k, 0, new ArrayList<Integer>());
}
/**
* 举例要不要两种状态
*
* @param a
* @param k
* @param cur
*/
private static void dfs(int[] a, int k, int cur, ArrayList<Integer> list) {
if (k == 0) {
System.out.print("Yes (" + kk + " = ");
int size = list.size();
for (int i = 0; i < size; i++) {
System.out.print(list.get(i) + (i == size - 1 ? "" : "+"));
}
System.out.println(")");
System.exit(0);
}
if (k < 0 || cur == a.length) {
return;
}
dfs(a, k, cur + 1, list);// 不要cur这个元素
list.add(a[cur]); // 可能加了很多不成功的 所以要回溯
int index = list.size() - 1;// 记录加进去的
dfs(a, k - a[cur], cur + 1, list);// 要这个元素
list.remove(index);// 回溯
}