原文:https://bafanglvren.ink/archives/53/
题目
部分和问题 (挑战程序设计竞赛)
给定整数 a 1 、a 2 、…、a n ,判断是否可以从中选出若干数,使它们的和恰好为 k。
样例
输入
n=4
a={1,2,4,7}
k=13
输出
Yes (13 = 2 + 4 + 7)
输入
n=4
a={1,2,4,7}
k=15
输出
No
思路:从i = 1,第1个数开始分支,算上这第i个数或者不算第i个数,在对算的和没算的数进行重复操作。
在进行到底的时候比对sum和k的值
import java.util.Scanner;
public class Main {
static int[] a;
static int n;
static int k;
static boolean dfs(int i, int sum) {
if (i == n) {
return sum == k;
}
//往下走一步,i+1,算上a[i]
if (dfs(i + 1, sum + a[i])) {
return true;
}
//往下走一步,i+1,不算上a[i]
if (dfs(i + 1, sum)) {
return true;
}
return false;
}
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
n = cin.nextInt();
int cnt = 0;
a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = cin.nextInt();
}
k = cin.nextInt();
if (dfs(0, 0)) {
System.out.println("Yes");
} else {
System.out.println("No");
}
}
}