[CODEVS1225]埃及分数解题报告

据说这是DFS-ID的一道入门水题。。但是我还是看了题解以后才做出来。

主要思路:①迭代加深确定深度;(分数个数最小)②在存在可行解的深度上求最优解。(最小分母最大)

注意问题:

①精度问题,不能用小数来做,应该保存一个分母和分子,并注意时刻约分。

②大小问题,可能会爆int!

③数据问题!明明可能会有多个最小分母最大的解,但数据是。。按照搜索的顺序的第一个。。

#include<iostream>
#include<cmath>
using namespace std;
#include<cstdio>
#include<cstring>
#include<cstdlib>
typedef long long lld;
int m=1;
lld ans[2000],now[2000];
bool flag;
lld gcd(lld a,lld b){
	if(!b)return a;
	else return gcd(b,a%b);
}
void yuefen(lld &a,lld &b){
	lld g=gcd(a,b);
	a/=g,b/=g;
}
void dfs(int x,int pred,lld A,lld B){
	lld a=A,b=B;
	yuefen(a,b);
	if(x==1){
		if(a==1&&b>pred){
			if(flag&&b>=ans[1])return;
			int i=0;/*
			printf("%d\n",b);
			if(flag&&b==ans[1])
				for(i=2;i<=m;++i)
					if(now[i]<ans[i])break;
					else if(now[i]>ans[i])return;
			if(i>m)return;
			*/
			now[1]=b;
			flag=1;
			memcpy(ans,now,(m+1)<<3);
			return;
		}
		return;
	}
	for(int i=pred,maxi=ceil((double)b*x/a);i<=maxi;++i){
		now[x]=i;
		dfs(x-1,i,a*i-b,b*i);
	}
}
int main(){
	lld a,b;
	cin>>a>>b;
	yuefen(a,b);
	while(!flag){
		dfs(m,1,a,b);
		++m;
	}
	for(int i=m;--i;)printf("%d ",ans[i]);
}


你可能感兴趣的:(DFS)