深さ優先探索で部分和問題を解きます
深さ優先探索で部分和問題を解きます
/**
* ある数列の中から、幾つかのの項を選んで所望の合計になるかどうか判定する。
* @author tatesuke
*/
public class 部分和問題 {
public static void main(String[] args) {
int[] 数列 = {1, 4, 3, 2, 5};
int 合計 = 13;
System.out.println(new 部分和Solver(数列, 合計).solve());
}
private static class 部分和Solver {
final int[] 数列;
final int 合計;
部分和Solver(int[] 数列, int 合計) {
this.数列 = 数列;
this.合計 = 合計;
}
boolean solve() {
return solve(0, 0);
}
private boolean solve(int i, int sum) {
if (sum == 合計) {
return true;
}
if (i == 数列.length) {
return false;
}
if (solve(i + 1, sum)) {
return true;
}
return solve(i + 1, sum + 数列[i]);
}
}
}