題目
代碼
import java.util.Scanner;
public class Main2dfs {
private static int n, a[], k;
/**
*
*
4
1 2 4 7
13
4
1 2 4 7
15
*/
public static void main(String[] args) {
// 輸入n, a[], k
Scanner in = new Scanner(System.in);
n = in.nextInt();
a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = in.nextInt();
}
k = in.nextInt();
if (dfs(0, 0)) {
System.out.println(true);
} else {
System.out.println(false);
}
}
// 已經從前i項得到了和sum,然後對於i項之後的進行分支
private static boolean dfs(int i, int sum) {
System.out.println("i:" + i + " sum:" + sum);
// 如果前n項都計算過了,則返回sum是否與k相等
if (i == n) {
return sum == k;
}
// 不加上a[i]的情況
if (dfs(i+1, sum)) {
return true;
}
// 加上a[i]的情況
if (dfs(i+1, sum+a[i])) {
return true;
}
// 無論是否加上a[i]都不能湊成k就返回false
return false;
}
}
圖解
題目和代碼出處
excel表單方便看自己寫的