题解 P2090 【数字对】
这题可用搜索,如果直接从头搜到尾只有50分,所以借鉴了一下楼下的方法,枚举到n时另一个数的每一种情况,从后往前搜,再加上剪枝,即可AC。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int minn=2000000000;
void search(int x,int y,int r){//X:第一个数;y:二;r:次数
if(r>minn)
return ;//最优性剪枝
//printf("%d %d %d\n",x,y,r);
if(x==1&&y==1){
minn=min(minn,r);
return ;
}//更新 if(x<1||y<1)
return ;//边界
if(x>y)
search(x-y,y,r+1);
else if(y>x)search(x,y-x,r+1);//这两步很重要,可以使一棵
//2叉树变为一条链
}
int main(){
int n;
scanf("%d",&n);
for(int i=2;i<n;i++)//枚举每一种情况
search(i,n,0);
printf("%d",minn);
return 0;
}