UVA

来源:互联网 发布:pc读取s7 200plc数据 编辑:程序博客网 时间:2024/06/03 19:43

提莫链接:Power Calculus

本题用到了IDA*。IDA*适用于没有明显上界的搜索。显然,如果没有明显上界,dfs会一直搜下去。如果用广搜的话代码量很大并且会耗费大量内存。那么IDA*就被发明出来了,它结合了dfs和bfs的优点,既可以像广搜那样层层递进的搜索,又不会耗费大量内存。
IDA*设置了一个上界maxd,maxd不断+1,每次搜的深度最大为maxd,这样就实现了像广搜那样一层一层的搜。记录路径只需要开一个数组就可以。此外,maxd还可以用来剪枝。本题中如果当前深度d大于maxd,或者剩余的步数中所能达到的最大值都达不到n(即每次都乘2),则return。
本题中每次优先加上较大的数会更快的达到目标值。而且每次得到的数t需要大于零,并且由于n最大为1000,所以t需要小于2000,如果大于等于2000了,那么最后几步必定是多余的。val[]记录每次得到的值。

代码:

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int n,maxd,flag,val[2005];void dfs(int d){    if(d>maxd || val[d]<<(maxd-d) < n) return;    if(val[d]==n)    {        flag=1;        return;    }    for(int i=d;i>=0;i--)    {        int t=val[d]+val[i];        if(t>0 && t<2000)        {            val[d+1]=t;            dfs(d+1);            if(flag) return;        }        t=val[d]-val[i];        if(t>0 && t<2000)        {            val[d+1]=t;            dfs(d+1);            if(flag) return;        }    }}int main(){    while(scanf("%d",&n) && n)    {        val[0]=1;        flag=0;        for(maxd=0;;maxd++)        {            dfs(0);            if(flag) break;        }        printf("%d\n",maxd);    }    return 0;}



原创粉丝点击