方法:迭代加深解答树并进行剪枝
剪枝点:
- 要表示的分数与已经分配到分数总和的差值要大于0才继续尝试
- 根据剩余深度和上面的差值确定每层尝试分数分母的上限,下限即前一分配好的分数的分母加1
#include <iostream>
#include <math.h>
using namespace std;
#define N 10000000
int array[N];
double is_equal(int a, int b, int cur)
{
double sum = 0;
for (int i = 0; i <= cur; i++)
sum += (double)1 / array[i];
return (double)a / b - sum;
}
int dfs(int cur, int d, int a, int b)
{
if (cur == d)
return 0;
int start = (int)(d - cur) / (is_equal(a, b, cur - 1));
int end = cur == 0 ? 2 : array[cur-1] + 1;
for (int i = start;i>=end; i--)
{
array[cur] = i;
double p = is_equal(a, b, cur);
if (abs(p) <= 0.00001)
{
for (int j = 0; j <= cur; j++)
cout << array[j] << ' ';
cout << endl;
return 1;
}
else if (p > 0)
{
if (dfs(cur + 1, d, a, b))
return 1;
}
}
return 0;
}
int main()
{
int a, b;
cin >> a >> b;
for (int i = 1; ; i++)
{
//cout << i << endl;
if (dfs(0, i, a, b))
break;
}
}