zoukankan      html  css  js  c++  java
  • POJ3134 Power Calculus IDA*搜索的一个应用

    题目链接:http://poj.org/problem?id=3134

    题目给出一个初始的x,要求操作只能是乘与除,问最少需要多少步才能算出x^n。这道题等价于给一个1,只能加或者减,问最少需要多少步才能得到n。可以把n拆开成许多个数相加或者相减,从搜索的角度来讲,用普通dfs的话很可能深度达到1000,所以可以对depth进行遍历,并且设置估价函数进行剪枝,只要当前的值以最快的方式迭代也不能得到n则说明在当前设置的深度下是不能达到预期的结果的。

    代码如下:

     1 #include<cstdio>
     2 #include<algorithm>
     3 #define abs(x) (x)>0?(x):(-(x))
     4 using namespace std;
     5 int n;
     6 int a[1005];
     7 int tmp=0;
     8 bool dfs(int cur,int dep)//当前搜索深度,目标深度 
     9 {
    10     if((a[cur-1]<<(dep-cur))<n)return false;//以最快的方式迭代也不能得到最终的结果 
    11     if(cur>dep)return false;
    12     if(cur==dep&&a[cur-1]==n)return true;
    13     for(int i=0;i<cur;i++)//对前面已经获得的加数进行枚举 
    14     {
    15         a[cur]=a[cur-1]+a[i];//a[cur-1]是前面已经得到的最终加数 
    16         if(dfs(cur+1,dep))return true;
    17         a[cur]=abs(a[cur-1]-a[i]);
    18         if(dfs(cur+1,dep))return true;
    19     }
    20     return false;
    21 }
    22 int main()
    23 {
    24     while(scanf("%d",&n)&&n)
    25     {
    26         int dep=0;//目标深度代表操作次数 
    27         tmp=0;
    28         while(1)
    29         {
    30             a[0]=1;
    31             if(dfs(1,dep))break;
    32             dep++; 
    33         }
    34         printf("%d
    ",dep-1);//由于在第0层没有操作,所以减一 
    35     }
    36  } 
  • 相关阅读:
    sklearn之线性回归
    机器学习概述
    scipy之定积分计算和简单图像处理
    scipy之插值器
    numpy之排序
    spring mvc 实现文件上传
    Maven安装本地jar包到本地仓库
    spring mvc实现转发和重定向
    sprign mvc 解决中文乱码问题
    spring mvc 中使用session
  • 原文地址:https://www.cnblogs.com/randy-lo/p/12610565.html
Copyright © 2011-2022 走看看