分析:
- 用模式匹配方法,他类似于非空子集的求解方式
- 用递归的方法(两个选择,选和不选)类似于选硬币(选和不选)
import java.util.ArrayList;
public class Main {
public static int[] a = {1, 2, 34, 5, 5};
public static int nl = a.length;
public static void main(String[] args) {
ArrayList< Integer> al = new ArrayList<>();
Solve(13, 0, al);
}
private static void Solve(int k, int n, ArrayList<Integer> al) {
//跳出循环
if(k == 0) {
System.out.println("YES");
System.out.println(al);
return;
}
if(k < 0 || n >= nl) {
return;
}
//选择该数
int index = al.size();
al.add(a[n]);
Solve(k - a[n], n + 1, al);//注意要回溯
al.remove(index);
//不选择该数
Solve(k, n + 1, al);
}
}
这个代码还未改善一下输出即可,运行结果为:
YES
[1, 2, 5, 5]