poj3134 Power Calculus

题意:每走一步将当前位置 cur 的值放进集合 set 中,每次从当前位置
往前或往后走的步数只能是 set 集合中的值,问到目的地 n 最少需要走多少步

ID-DFS

虽然只要得出最少步数,但是这题需要用搜索找出最优解的走法
dfs(cur) 表示已经求得最优解的前 cur 步
并保存第 cur 步的位置在 way[cur] 数组中
用 step 表示限制的递归深度


感觉 ID-dfs 跟 bfs 应该差不多,但是 bfs 保存解的话就比较麻烦

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

const int maxn = 1005;
int n;
int way[maxn];

int step; // upper bound
int ans;

//已经求得 way[1], ... way[cur], 要猜出 way[cur+1] 的值
bool dfs(int cur)
{
    if( cur > step )
        return false;
    if( way[cur] == n )
        return true;
    if( way[cur] <= 0 || way[cur]>10000)
        return false;
    if( way[cur]*(1<<(step-cur)) < n) // 强剪枝
        return false;

    for(int i=0; i<=cur; i++)
    {
        way[cur+1] = way[cur] + way[i];
        if(dfs(cur+1))
            return true;
        way[cur+1] = way[cur] - way[i];
        if(dfs(cur+1))
            return true;
    }
    return false;
}

int main()
{
    while(cin>>n && n)
    {
        if(n==1)
        {
            cout<<0<<endl;
            continue;
        }

        step=1;
        while(true)
        {
            way[0] = 1;
            if(dfs(0))
                break;
            step++;
        }
        cout<<step<<endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值