📒 全探索.
📌全探索の特徴.
- 数列の要素を選ぶ組み合わせを列挙するアルゴリズム.
- 再帰関数の中で2つの再帰関数を呼び出せば計算量O(2^n)となる.
📌全探索の手順.
1️⃣solve(i,m)において与えられた整数を作ることが出来た場合はmが0となる.
2️⃣mが0より大きくiがn以上、またはmが0より小さくなった時は整数が作れなかった.
3️⃣solve(i + 1, m)かsolve(i + 1, m - S[i])のいずれかがtrueの時に作れる.
数列A={1,5,7}に対して、8が作れるかを判定する例.
#include <iostream>
using namespace std;
int S[] = {1, 2, 3, 5, 6, 7, 8, 11, 19, 20, 44, 90};
int n = 12;
int solve(int i, int m) {
if (m == 0) {
return 1;
}
if (i >= n) {
return 0;
}
int res = solve(i + 1, m) || solve(i + 1, m - S[i]);
return res;
}
int main(int argc, char** argv) {
int T[] = {3, 13, 300};
int q = 3;
for (int i = 0; i < q; i++) {
if (solve(0, T[i])) {
cout << "Yes." << endl;
} else {
cout << "No." << endl;
}
}
return 0;
}
🔎対象ソースは以下に格納.
/source/4.recursion/allsearch.cpp