Procedure IDA_STAR(StartState) Begin PathLimit := H(StartState) - 1; Succes := False; Repeat inc(PathLimit); StartState.g = 0; Push(OpenStack, StartState); Repeat CurrentState := Pop(OpenStack); If Solution(CurrentState) then Success = True Elseif PathLimit >= CurrentState.g + H(CurrentState) then For each Child(CurrentState) do Push(OpenStack, Child(CurrentState)); until Success or empty(OpenStack); until Success or ResourceLimtsReached; end;
booldfs(int d, long a, long b, int e){ // 深度限制 分子 分母 上一个单位分数的分母 if (d == 0) { // a = 0 表示已经成功将分数分解 if (a == 0 && better()) ans = current; return a == 0; }
// 约分 long gcd = __gcd(a, b); a /= gcd; b /= gcd;
bool solved = false; // the min value of e: // a/b - 1/e >= 0 // e >= b/a // 下一个分母的最小值 e1 应该是 比 e 大 且 b / a 上取整数 int e1 = max(e + 1, int((b + a - 1) / a)); // b/a <= e <= MAX_E // b/a <= MAX_E if (b > a * MAX_E) { returnfalse; } while(e1) { // the max value of e: // d * (1/e) >= a/b // d/e >= a/b if (d * b < a * e1) {// 剩余深度不足够分解 return solved; } // 验证通过可行 current.push_back(e1); // a/b - 1/e1 solved |= dfs(d - 1, a * e1 - b, b * e1, e1); // d - 1:递归深度减一,表示已经使用了一个单位分数,还剩下 d - 1 个单位分数可以继续分解 // 通分相减 (a * e1 - b) / (be1) // 回头复原 current.pop_back();// 删掉最后一个元素 size-1 // 下一位 e1 ++ ; } return solved; }
intsolve(){ ans.clear(); current.clear(); for (int maxd = 1; maxd <= 100; maxd++) // 深度上限 if (dfs(maxd, a, b, 1)) return maxd; return-1; // 未检索到 }
intmain(){
cin >> a >> b; int maxd = solve();
for (int i = 0; i < maxd; i++) cout << ans[i] << " ";