能力强的人善于解决问题,有智慧的人善于绕过问题。 区别很微妙,小心谨慎做后者。
全部博文(399)
分类: LINUX
2009-12-25 20:00:36
#include
#include
const int maxdepth=100;
int depth=0,min,cmdepth;
//depth :当前搜索深度-1,
//min :所有已求解中最小的最后一个分母值,
//cmdepth:当前最大搜索深度
int ans[maxdepth], out[maxdepth];
void find(int a,int b,int x)//a/b, 1/x,x为前一项的分母
{
if(depth>=cmdepth||x>=min) return;
if(b%a==0){
b/=a;
if(b=min) return; //分母减小的也不行
ans[depth]=b;
min=b;
//因为若加数个数相同的,最小的分数越大越好。
memcpy(out,ans,(depth+1)*sizeof(int));//存储结果
return;
}
else{
if(depth>=cmdepth-1) return;
while(a*x<=b&&x
while(x
if(a*x>=b*(cmdepth-depth))//剪枝,a*x比本层上限还大
break;
ans[depth]=x;
depth++; //进入下一层搜索
find(a*x-b,b*x,x+1);
depth--; //恢复现场
x++; //本层按分母升序遍历,基元素当然是b/a了
}
}
return;
}
int main()
{
int a,b;
scanf("%d%d",&a,&b);
min=1000000;
//从1开始,是因为根据题目要求:
加数少的比加数多的好,否则就从maxlen开始了,呵呵
for(cmdepth=1;cmdepth<=maxdepth;cmdepth++){
find(a,b,1);
if(min<1000000)
break;
}
for(int k=0;k
printf("%d\n",out[cmdepth-1]);
return 0;
}