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 搜索。
|
||||||
|
|
||||||
|
重复以上过程,直到找到目标或达到全局深度上限。
|
||||||
|
|
||||||
|
> 重点是树没有上限的情况->棋类竞技
|
||||||
100
std-Cpp/BitWiseOperation/readme.md
Normal file
100
std-Cpp/BitWiseOperation/readme.md
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
好嘞 👍 你问到的 **C++ 位运算符**,其实是底层操作里最常用的一类。它们直接对整数的**二进制位**进行操作,比算术运算更接近硬件。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔑 C++ 位运算符总览
|
||||||
|
|
||||||
|
| 运算符 | 名称 | 含义 | 示例(假设 `a = 6 (0110₂)`, `b = 11 (1011₂)`) | 结果 | |
|
||||||
|
| --------------- | ---------- | ------------------------------------------------ | ---------------------------------------- | ----------- | -- |
|
||||||
|
| `&` | 按位与 (AND) | 对应位都为 1 才为 1 | `a & b = 0010₂` | 2 | |
|
||||||
|
| <code>\|</code> | 按位或 (OR) | 对应位至少一个为 1 就为 1 | \`a | b = 1111₂\` | 15 |
|
||||||
|
| `^` | 按位异或 (XOR) | 对应位相同为 0,不同为 1 | `a ^ b = 1101₂` | 13 | |
|
||||||
|
| `~` | 按位取反 (NOT) | 0 变 1,1 变 0 | `~a = ...11111001₂` | -7(补码表示) | |
|
||||||
|
| `<<` | 左移 | 所有二进制位向左移,右边补 0 | `a << 1 = 1100₂` | 12 | |
|
||||||
|
| `>>` | 右移 | 所有二进制位向右移,左边补符号位(算术右移)或 0(逻辑右移,C++ 对有符号数实现依赖编译器) | `a >> 1 = 0011₂` | 3 | |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📘 详细解释
|
||||||
|
|
||||||
|
### 1. 按位与 `&`
|
||||||
|
|
||||||
|
常用来 **取某些位**:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
int x = 13; // 1101₂
|
||||||
|
int mask = 4; // 0100₂
|
||||||
|
if (x & mask) cout << "第3位是1" << endl; // 输出 第3位是1
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 按位或 `|`
|
||||||
|
|
||||||
|
常用来 **设置某些位为 1**:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
int x = 5; // 0101₂
|
||||||
|
int mask = 2; // 0010₂
|
||||||
|
x = x | mask; // 0111₂ -> 7
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 按位异或 `^`
|
||||||
|
|
||||||
|
* 不同为 1,相同为 0。
|
||||||
|
* 特性:`a ^ a = 0`,`a ^ 0 = a`。
|
||||||
|
* 常用于 **交换变量** 或 **求对称差**。
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
int a = 5, b = 9;
|
||||||
|
a = a ^ b;
|
||||||
|
b = a ^ b;
|
||||||
|
a = a ^ b;
|
||||||
|
cout << a << " " << b << endl; // 输出 9 5
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. 按位取反 `~`
|
||||||
|
|
||||||
|
逐位取反。注意负数结果与补码有关:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
int a = 6; // 0000...0110
|
||||||
|
cout << ~a << endl; // -7
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. 左移 `<<`
|
||||||
|
|
||||||
|
相当于乘以 $2^n$(但可能溢出):
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
int a = 3; // 0011₂
|
||||||
|
cout << (a << 2) << endl; // 1100₂ = 12
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6. 右移 `>>`
|
||||||
|
|
||||||
|
相当于整除 $2^n$(但要区分有符号/无符号):
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
int a = 12; // 1100₂
|
||||||
|
cout << (a >> 2) << endl; // 0011₂ = 3
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚡ 补充:常见用途
|
||||||
|
|
||||||
|
1. **快速运算**:`x << 1` 相当于 `x * 2`,`x >> 1` 相当于 `x / 2`。
|
||||||
|
2. **掩码操作**:取某些位、清零某些位、设置某些位。
|
||||||
|
3. **集合表示**:一个整数的二进制位可以看作集合的元素是否存在。
|
||||||
|
4. **加密/压缩**:异或在流密码、校验和算法里很常见。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
✅ **总结**
|
||||||
|
|
||||||
|
* C++ 提供了 `& | ^ ~ << >>` 六个主要位运算符。
|
||||||
|
* 它们直接操作二进制位,速度快、常用于底层优化。
|
||||||
|
* 常见技巧:掩码操作、快速乘除、集合运算、加密。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
要不要我帮你写一个 **完整的小程序**,输入两个整数,输出它们的二进制表示,以及 `& | ^ ~ << >>` 的运算结果?这样能直观看清效果。
|
||||||
Reference in New Issue
Block a user