IDS
This commit is contained in:
14
Algorithm/Divide&Conquer/最大连续和.cpp
Normal file
14
Algorithm/Divide&Conquer/最大连续和.cpp
Normal file
@@ -0,0 +1,14 @@
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
using namespace std;
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD>ұߣ<D2B1><DFA3><EFBFBD>Խ<EFBFBD>м<EFBFBD>
|
||||
vector<int> arr;
|
||||
|
||||
int dfs(int l, int r){
|
||||
|
||||
}
|
||||
|
||||
int main(){
|
||||
|
||||
return 0;
|
||||
}
|
||||
63
Algorithm/IterativeDeepening/Egypt-Fraction-AI-BAD.cpp
Normal file
63
Algorithm/IterativeDeepening/Egypt-Fraction-AI-BAD.cpp
Normal file
@@ -0,0 +1,63 @@
|
||||
#include <bits/stdc++.h>
|
||||
using namespace std;
|
||||
|
||||
vector<int> best_solution; // <20><>ǰ<EFBFBD><C7B0><EFBFBD>Ž<EFBFBD>
|
||||
int best_max_den = INT_MAX; // <20><>ǰ<EFBFBD><C7B0><EFBFBD>Ž<EFBFBD><C5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ
|
||||
|
||||
// gcd <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
long long gcd(long long a, long long b) {
|
||||
return b == 0 ? a : gcd(b, a % b);
|
||||
}
|
||||
|
||||
// DFS <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
void dfs(vector<int>& path, int step, int max_depth,
|
||||
long long num, long long den, int a, int b, int start) {
|
||||
if(step > max_depth) return;
|
||||
|
||||
if(num * b == den * a) {
|
||||
int cur_max = *max_element(path.begin(), path.end());
|
||||
if(best_solution.empty() || cur_max < best_max_den) {
|
||||
best_solution = path;
|
||||
best_max_den = cur_max;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>֦
|
||||
long long i_start = max((long long)start, (den + num - 1) / num); // ceil(den/num)
|
||||
for(long long i = i_start; i <= 15000; i++) {
|
||||
path.push_back(i);
|
||||
long long new_num = num * i + den;
|
||||
long long new_den = den * i;
|
||||
long long g = gcd(new_num, new_den);
|
||||
new_num /= g;
|
||||
new_den /= g;
|
||||
if(new_num * b <= new_den * a) { // <20><>֦
|
||||
dfs(path, step + 1, max_depth, new_num, new_den, a, b, i + 1);
|
||||
}
|
||||
path.pop_back();
|
||||
}
|
||||
}
|
||||
|
||||
// IDS <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
vector<int> egyptian_fraction(int a, int b) {
|
||||
best_solution.clear();
|
||||
best_max_den = INT_MAX;
|
||||
|
||||
for(int depth = 1; depth <= 15000; depth++) { // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȿɵ<C8BF>
|
||||
vector<int> path;
|
||||
dfs(path, 0, depth, 0, 1, a, b, 1);
|
||||
if(!best_solution.empty()) break; // <20>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD>̳<EFBFBD><CCB3>Ƚ<EFBFBD>
|
||||
}
|
||||
return best_solution;
|
||||
}
|
||||
|
||||
int main() {
|
||||
int a, b;
|
||||
cin >> a >> b;
|
||||
vector<int> res = egyptian_fraction(a, b);
|
||||
for(int x : res) cout << x << " ";
|
||||
cout << endl;
|
||||
return 0;
|
||||
}
|
||||
|
||||
143
Algorithm/IterativeDeepening/Egypt-Fraction-AI.cpp
Normal file
143
Algorithm/IterativeDeepening/Egypt-Fraction-AI.cpp
Normal file
@@ -0,0 +1,143 @@
|
||||
#include <bits/stdc++.h>
|
||||
|
||||
using namespace std;
|
||||
|
||||
typedef long long ll; // ʹ<><CAB9> long long <20>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>ϴ<EFBFBD><CFB4>ķ<EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD>GCD<43><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
|
||||
ll gcd(ll a, ll b) {
|
||||
return b == 0 ? a : gcd(b, a % b); // շת<D5B7><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> n/d Լ<><D4BC>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ
|
||||
pair<ll, ll> reduce(ll n, ll d) {
|
||||
ll g = gcd(abs(n), d); // <20><><EFBFBD><EFBFBD> n <20><> d <20><> GCD<43><44>abs(n) <20><>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
return {n / g, d / g}; // <20><><EFBFBD><EFBFBD>Լ<EFBFBD>ֺ<EFBFBD><D6BA>ķ<EFBFBD><C4B7>Ӻͷ<D3BA>ĸ
|
||||
}
|
||||
|
||||
// <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4>Ľṹ<C4BD><E1B9B9>
|
||||
struct State {
|
||||
ll num, den; // <20><>ǰʣ<C7B0><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> num/den
|
||||
vector<ll> dens; // <20><>ѡ<EFBFBD><D1A1><EFBFBD>ĵ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD>ĸ<EFBFBD>б<EFBFBD>
|
||||
|
||||
// <20><><EFBFBD>㵱ǰ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ
|
||||
ll max_den() const {
|
||||
if (dens.empty()) return 0; // <20><><EFBFBD><EFBFBD>û<EFBFBD>з<EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0
|
||||
return *max_element(dens.begin(), dens.end()); // <20><><EFBFBD>ط<EFBFBD>ĸ<EFBFBD>б<EFBFBD><D0B1>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>ֵ
|
||||
}
|
||||
};
|
||||
|
||||
// <20><>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> unordered_set <20>д洢״̬<D7B4><CCAC><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>δʹ<CEB4>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD>չ<EFBFBD><D5B9>
|
||||
struct StateHash {
|
||||
size_t operator()(const State& s) const {
|
||||
string str;
|
||||
for (ll x : s.dens) str += to_string(x) + ",";
|
||||
str += to_string(s.num) + "/" + to_string(s.den);
|
||||
return hash<string>()(str);
|
||||
}
|
||||
};
|
||||
|
||||
// <20><>ȡ<EFBFBD><C8A1>ǰ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD>к<EFBFBD><D0BA><EFBFBD>״̬
|
||||
vector<State> get_successors(const State& state, int limit, int depth) {
|
||||
vector<State> res; // <20>洢<EFBFBD><E6B4A2><EFBFBD>п<EFBFBD><D0BF>ܵĺ<DCB5><C4BA><EFBFBD>״̬
|
||||
ll r = state.num, s = state.den; // <20><>ǰʣ<C7B0><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> r/s
|
||||
if (r == 0) return res; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ
|
||||
|
||||
// ȷ<><C8B7><EFBFBD><EFBFBD>С<EFBFBD><D0A1>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD>֤<EFBFBD><D6A4>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> r/s >= 1/d
|
||||
ll last_d = state.dens.empty() ? 0 : state.dens.back();
|
||||
ll min_d = max(last_d + 1, (s + r - 1) / r); // min_d = ceil(s/r)
|
||||
|
||||
// <20><><EFBFBD>÷<EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD>ޣ<EFBFBD><DEA3><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
const ll MAX_D = 10000000LL; // <20><><EFBFBD><EFBFBD><EFBFBD>İ<EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD>
|
||||
|
||||
// ö<>ٿ<EFBFBD><D9BF>ܵĵ<DCB5>λ<EFBFBD><CEBB>ĸ d
|
||||
for (ll d = min_d; d <= MAX_D; ++d) {
|
||||
// <20>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD>ಽ<EFBFBD><E0B2BD><EFBFBD>Ƿ<EFBFBD><C7B7>㹻<EFBFBD><E3B9BB>ʾʣ<CABE><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
int rem_steps = limit - depth - 1; // ʣ<><CAA3><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
|
||||
double max_sum_after = 0.0; // ʣ<>ಽ<EFBFBD><E0B2BD><EFBFBD>ܱ<EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
for (int i = 1; i <= rem_steps; ++i) {
|
||||
max_sum_after += 1.0 / (d + i); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD>
|
||||
}
|
||||
double this_contrib = 1.0 / d; // <20><>ǰ<EFBFBD><C7B0>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>Ĺ<EFBFBD><C4B9><EFBFBD>
|
||||
double target = (double)r / s; // Ŀ<><C4BF>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><D7BC>Ϻ<EFBFBD><CFBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܹ<EFBFBD><DCB9><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1>Ŀ<EFBFBD>꣬<EFBFBD><EAA3AC>֦
|
||||
if (this_contrib + max_sum_after < target - 1e-10) break;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD>r/s - 1/d = (r*d - s) / (s*d)
|
||||
ll new_num = r * d - s;
|
||||
if (new_num < 0) continue; // <20>·<EFBFBD><C2B7><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>״̬
|
||||
ll new_den = s * d;
|
||||
auto p = reduce(new_num, new_den); // Լ<><D4BC><EFBFBD>·<EFBFBD><C2B7><EFBFBD>
|
||||
State ns = {p.first, p.second, state.dens}; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
|
||||
ns.dens.push_back(d); // <20><><EFBFBD>ӵ<EFBFBD>ǰ<EFBFBD><C7B0>λ<EFBFBD><CEBB>ĸ
|
||||
res.push_back(ns); // <20><><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DFS<46><53><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
void dfs(const State& state, int depth, int limit, vector<State>& solutions) {
|
||||
if (depth > limit) return; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (state.num == 0 && !state.dens.empty()) { // <20>ҵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>⣺<EFBFBD><E2A3BA><EFBFBD><EFBFBD>Ϊ 0 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ĸ
|
||||
solutions.push_back(state); // <20><>¼<EFBFBD><C2BC>
|
||||
return; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><D5B9>·<EFBFBD><C2B7>
|
||||
}
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>к<EFBFBD><D0BA><EFBFBD>״̬
|
||||
for (const auto& next : get_successors(state, limit, depth)) {
|
||||
dfs(next, depth + 1, limit, solutions); // <20>ݹ<EFBFBD><DDB9><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IDS<44><53><EFBFBD><EFBFBD>Ѱ<EFBFBD><D1B0><EFBFBD><EFBFBD><EFBFBD>̳<EFBFBD><CCB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8>С<EFBFBD>İ<EFBFBD><C4B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
State find_best_egyptian(ll a, ll b) {
|
||||
auto p = reduce(a, b); // Լ<><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
State start = {p.first, p.second, {}}; // <20><>ʼ״̬
|
||||
State best; // <20><>¼<EFBFBD><C2BC><EFBFBD>ѽ<EFBFBD>
|
||||
ll best_max = LLONG_MAX; // <20><><EFBFBD>ѽ<EFBFBD><D1BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ
|
||||
int limit = 0; // <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
while (true) {
|
||||
++limit; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
vector<State> solutions; // <20>洢<EFBFBD><E6B4A2>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD>н<EFBFBD>
|
||||
dfs(start, 0, limit, solutions); // ִ<><D6B4> DFS
|
||||
if (!solutions.empty()) { // <20><><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD>
|
||||
for (const auto& s : solutions) { // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD>
|
||||
ll cur_max = s.max_den(); // <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ
|
||||
if (cur_max < best_max) { // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѽ<EFBFBD>
|
||||
best = s;
|
||||
best_max = cur_max;
|
||||
}
|
||||
}
|
||||
return best; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѽ<EFBFBD>
|
||||
}
|
||||
if (limit > 100) { // <20><>ȫ<EFBFBD><C8AB><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD>
|
||||
cout << "No solution found within limit." << endl;
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main() {
|
||||
ll a, b;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӻͷ<D3BA>ĸ<EFBFBD><C4B8>Ҫ<EFBFBD><D2AA> 0 < a < b <20>һ<EFBFBD><D2BB><EFBFBD>
|
||||
cout << "Enter numerator and denominator (a b, with 0 < a < b, gcd=1): ";
|
||||
cin >> a >> b;
|
||||
if (a >= b || a <= 0 || gcd(a, b) != 1) { // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤
|
||||
cout << "Invalid input: require 0 < a < b and gcd(a,b)=1" << endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
State result = find_best_egyptian(a, b); // Ѱ<><D1B0><EFBFBD><EFBFBD><EFBFBD>Ѱ<EFBFBD><D1B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
cout << a << "/" << b << " = ";
|
||||
for (size_t i = 0; i < result.dens.size(); ++i) {
|
||||
if (i > 0) cout << " + ";
|
||||
cout << "1/" << result.dens[i]; // <20><>ӡ<EFBFBD><D3A1>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
|
||||
}
|
||||
cout << endl;
|
||||
cout << "Length: " << result.dens.size() << endl; // <20><>ӡ<EFBFBD>ֽⳤ<D6BD><E2B3A4>
|
||||
cout << "Max denominator: " << result.max_den() << endl; // <20><>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ
|
||||
|
||||
return 0;
|
||||
}
|
||||
BIN
Algorithm/IterativeDeepening/Egypt-Fraction-AI.exe
Normal file
BIN
Algorithm/IterativeDeepening/Egypt-Fraction-AI.exe
Normal file
Binary file not shown.
49
Algorithm/IterativeDeepening/Egypt-Fraction-BAD.cpp
Normal file
49
Algorithm/IterativeDeepening/Egypt-Fraction-BAD.cpp
Normal file
@@ -0,0 +1,49 @@
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <cmath>
|
||||
using namespace std;
|
||||
// f = a/b
|
||||
double checkv(const vector<int>& x){
|
||||
double c = 0.0;
|
||||
for(auto q : x){
|
||||
c += 1.0 / q;
|
||||
}
|
||||
return c;
|
||||
//return fabs(c - r) < 1e-9; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƱȽ<C6B1>
|
||||
}
|
||||
|
||||
//<2F><>step<65><70>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
|
||||
bool dfs(vector<int>& path, int step, int max_depth, int a, int b, int max_val){
|
||||
double r = static_cast<double>(a) / b;
|
||||
if(fabs(checkv(path) - r) < (1e-9)){
|
||||
for(int x : path) cout << x << " ";
|
||||
cout << endl;
|
||||
return true;
|
||||
}
|
||||
if(checkv(path) > r + (1e-9)) return false;
|
||||
if(step == max_depth) return false;
|
||||
|
||||
int start = path.empty() ? 1 : path.back();
|
||||
for(int i = start; i <= max_val; i++){
|
||||
path.push_back(i);
|
||||
if(dfs(path, step + 1, max_depth, a, b, max_val)) return true;
|
||||
path.pop_back();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ids(int limit, int a, int b, int max_val){
|
||||
for(int depth = 1; depth <= limit; depth++){
|
||||
vector<int> path;
|
||||
if(dfs(path, 0, depth, a, b, max_val)) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
int main(){
|
||||
int aa, bb, max;
|
||||
cin >> aa >> bb;
|
||||
max = 200;
|
||||
ids(10, aa, bb, max);
|
||||
return 0;
|
||||
}
|
||||
15
Algorithm/IterativeDeepening/readme.md
Normal file
15
Algorithm/IterativeDeepening/readme.md
Normal file
@@ -0,0 +1,15 @@
|
||||
🔹 基本思想
|
||||
|
||||
广度优先搜索 (BFS):逐层扩展,能保证找到最优解,但需要大量内存。
|
||||
|
||||
深度优先搜索 (DFS):沿一条路径搜索下去,内存消耗小,但可能陷入深层无解分支,不能保证最优解。
|
||||
|
||||
**迭代加深搜索 (IDS) 的做法是:**
|
||||
|
||||
设定一个最大搜索深度限制(depth limit),先用 DFS 在这个深度内搜索。
|
||||
|
||||
如果没找到解,就把深度限制增加 1,再次用 DFS 搜索。
|
||||
|
||||
重复以上过程,直到找到目标或达到全局深度上限。
|
||||
|
||||
> 重点是树没有上限的情况->棋类竞技
|
||||
Reference in New Issue
Block a user