Power Calculus UVA - 1374(IDA* 状态空间搜索)

#include<cstdio>
#include<cstring>
using namespace std;

int n, a[14]; //注意选择设定的状态

bool dfs(int d, int maxd)
{
    if (a[d] == n)
        return true;
    if (d == maxd) //若当d达到maxd然而仍然达不到目标状态,则退出并返回错//添上这一语句是因为后续剪枝判断不充分,漏掉一些情况
        return false;
    int maxv = -1;
    for(int i=0;i<=d;i++)
        if (maxv < a[i])
        {
            maxv = a[i];
        }
    if ((maxv << (maxd - d)) < n) //剪枝
        return false;
    for (int i = d; i >= 0; i--)//结点排序
    {
        a[d + 1] = a[d] + a[i];//结点排序
        if(dfs(d + 1, maxd))//用if迭代返回
            return true;
        a[d + 1] = a[d] - a[i];
        if (dfs(d + 1, maxd))
            return true;
    }
    return false;
}

int solve(int n)
{
    if (n == 1) //零输入
        return 0;
    a[0] = 1;
    const int max_ans = 13;// we got it by experimenting
    for (int maxd = 1; maxd < max_ans; maxd++)
        if (dfs(0, maxd))
            return maxd;//搜索成功必到达maxd,因此返回maxd
    return max_ans;
}


int main()
{
    while (scanf("%d", &n) && n)
    {
        printf("%d\n", solve(n));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值