解法一:
import java.util.ArrayList;
import java.util.Scanner;
public class Practice_部分和 {
static void dfs(int[] a, int k, int cur, ArrayList<Integer> res) {
if (k == 0) {
System.out.println("Yes");
for (int i = 0; i < res.size(); i++) {
System.out.print(res.get(i) + " ");
}
System.exit(0);//退出程序
}
if (cur == a.length || k < 0) return;
dfs(a, k, cur + 1, res);//没有选择当前这个数
res.add(a[cur]);
int index = res.size() - 1;
dfs(a, k - a[cur], cur + 1, res);//选择当前这个数
res.remove(index);
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = in.nextInt();
}
int k = in.nextInt();
dfs(a,k,0,new ArrayList<>());
}
}
解法二:
import java.util.ArrayList;
import java.util.Scanner;
public class Practice_部分和 {
//解法二(利用二进制解法)
static ArrayList<Integer> getSubSets(int[] arr, int n, int k) {
int sum = 0;
ArrayList<Integer> res = new ArrayList<>();
for (int i = (int) Math.pow(2, n) - 1; i >= 0; i--) {
sum=0;
ArrayList<Integer> s = new ArrayList<>();
for (int j = n - 1; j >= 0; j--) {
if (((i >> j) & 1) == 1) {
s.add(arr[j]);
sum += arr[j];
}
}
if (sum == k) {
res = s;
break;
}
}
return res;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = in.nextInt();
}
int k = in.nextInt();
ArrayList<Integer> res = new ArrayList<>();
res = getSubSets(a, n, k);
for (int i = 0; i < res.size(); i++) {
System.out.print(res.get(i) + " ");
}
}
}