7.6迭代加深搜索

来源:互联网 发布:一比一可拆卸枪模淘宝 编辑:程序博客网 时间:2024/05/16 04:47

迭代加深搜索是一个应用范围很广的算法,不仅可以像回溯发那样找一个解,也可以像状态空间搜索那样找一条路径

诶及分数问题

分析:

解决方案是采用迭代加深搜索,从小到大枚举深度上限maxd,每次执行只考虑深度不超过maxd的结点。此过程中还可以继续剪枝

int ok=0;for(maxd=1;;maxd++){    memset(ans,-1,sizeof ans);    if(dfs(0,get_first(a,b),a,b)) {ok=1; break; }}//其中get_first(a,b)是满足1/c<=a/b的最小C,迭代加深搜索过程如下//如果当前解V比目前最有解更优,更新ansbool better(int d){    for(int i=d;i>=0;i--) if(v[i]!=ans[i]){        return ans[i]==-1||v[i]<ans[i];    }    return false;}//当前深度为d,分母不能小于from,分数之和恰好为aa/bbbool dfs(int d,int from,LL aa,LL bb){    if(d==maxd){        if(bb%aa) return false;        v[d]=bb/aa;        if(better(d)) memcpy(ans,v,sizeof(LL)*(d+1));        return true;    }    bool ok=false;    from=max(from,get_first(aa,bb)); //枚举的起点    for(int i=from; ;i++){        //剪枝:如果剩下的maxd+1-d个分数全部都是1/i,加起来仍然不超过aa/bb,则无解        if(bb*(maxd+1-d)<=i*aa) break;        v[d]=i;        //计算aa/bb-1/i,设结果为a2/b2        LL b2=bb*i;        LL a2=aa*i-bb;        Ll g=gcd(a2,b2);  //以便约分        if(dfs(d+1,i+1,a2/g,b2/g)) ok=true;    }    return ok;}


0 0
原创粉丝点击