6/29

粗浅地学习了一下IDA*,感觉上来说,IDA *的核心部分就是它的估价函数,设计正确的估价函数,以此可以大大减小搜索树的规模。这种算法尝用于搜索树的边界并不明确,需要迭代加深搜索的这一类题目。——小记

1.快速幂计算uva1374

(之前也学过快速幂,通过二进制分解等方法来求解,当然,也可以采用迭代加深搜索算法求解)

  1. 快速幂最根本的就是利用当前求得的数进行乘积计算,以此达到快速得到幂的结果。很容易得出,我们可以把当前求出的幂的种类作为状态(用指数间的加减求得最后的结果)
  2. 迭代加深,枚举maxd,即最大步数,如果能成功,就break,输出maxd即可
  3. 对于当前所求得的每一个幂的指数,可以选择加(即乘),可以选择减(即除),结果当然应该是合法的
点击查看代码
#include<bits/stdc++.h> using namespace std; const int MAXN = 2000; int n; int vis[MAXN]; vector<int> v; bool flag = 0; bool dfs(int cnt,int maxd,int now){//now表示现在正在处理的指数 if(now == n || flag){ flag = 1; return 1; } if(cnt >= maxd || now <= 0 || now * pow(2,maxd - cnt) < n)return 0; vis[cnt] = now; for(int i = 0; i <= cnt; i++){ if(dfs(cnt + 1, maxd,now + vis[i]))return 1; if(dfs(cnt + 1,maxd,now - vis[i]))return 1; } return 0;//没有找到正解,自然返回0 } void deep(){ int cnt = 1; while(1){ memset(vis,0,sizeof vis); bool now = dfs(0,cnt,1); flag = 0; if(now){ printf("%d\n",cnt); break; } cnt++; } } int main(){ while(scanf("%d",&n) == 1){ if(n == 0)break; if(n == 1){ printf("0\n"); continue; } deep(); } }

__EOF__

本文作者Never Gonna Give You Up!
本文链接https://www.cnblogs.com/CZ-9/p/16425075.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   腾云今天首飞了吗  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示