codevs 2541 幂运算(迭代加深搜索)
2024-08-24 22:06:33
/*
一开始想到了简单的深搜 维护当前可用的mi数组
然后回溯用哪个 不断更新新产生的mi
这样的问题是 由于mi不断产生 搜索规模扩大
不好 不好 下面是奇丑的WA掉的代码 做个反面教材
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,ans=0x3f3f3f3f,f[],s[],top,vis[];
void Dfs(int p,int c)
{
if(p<=||p>n*)return;
if(f[p]==)s[++top]=p,f[p]=;
if(p==n){ans=min(ans,c);return;}
if(c>ans)return;
for(int i=;i<=top;i++)
if(vis[i]==)
{
vis[i]=;
Dfs(p+s[i],c+);
Dfs(p-s[i],c+);
vis[i]=;
}
}
int main()
{
scanf("%d",&n);
ans=n;
Dfs(,);
printf("%d\n",ans);
return ;
}
/*
正解是迭代加深
对于每次的搜索 我们限制最多能做几次运算
这样搜索的规模就大大减小
同样的维护已经得到的mi数组
数组的大小对应做了几次运算
加上几个剪枝:
如果mi中最大的<<(limit-k)都到不了n 搜索失败
生成新的mi的时候 尽量组合数大的 这样也可以减小规模
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define N 20
using namespace std;
int n,a[N*];
bool Dfs(int k,int limit)
{
if(a[k]==n)return ;
if(k==limit)return ;
int maxx=;
for(int i=;i<=k;i++)maxx=max(maxx,a[k]);
if(maxx<<(limit-k)<n)return ;
for(int i=k;i>=;i--)
{
a[k+]=a[i]+a[k];
if(Dfs(k+,limit))return ;
a[k+]=a[k]-a[i];
if(Dfs(k+,limit))return ;
}
return ;
}
int find()
{
if(n==)return ;
a[]=;
for(int i=;i<=N;i++)
if(Dfs(,i))return i;
}
int main()
{
scanf("%d",&n);
printf("%d\n",find());
return ;
}
最新文章
- javascript之Object.defineProperty的奥妙
- 汗,Google又调整了编译工具(升级SDK先备份!!!)
- 获得Window窗口权限的三种方法
- Node.js~sails.js~package.json的作用
- Virtual Box常用指令
- SwipeRefreshLayout 首次打开出现加载图标
- rapid js framework
- [转载] Linux下多路复用IO接口 epoll select poll 的区别
- Loadrunner脚本之C语言文件处理函数
- URAL1635. Mnemonics and Palindromes(DP)
- 开发中遇到的angularJs的小问题
- Cannot declare class app\home\controller\Cases because the name is already in use
- HTML5可以省略全部标记的元素
- 99%的Linux运维工程师必须要掌握的命令及运用
- Javaweb里“容器“为何出现,应用在哪,未来发展趋势
- VS快捷键失效问题
- Django Rest framework基础使用之Request/Response
- Java的Unsafe类
- HDU6216
- AWT和Swing的关系
热门文章
- bzoj1855: [Scoi2010]股票交易
- windows下搭建PHP环境
- java-web-j2e学习建议路线
- STM32 枚举类型和结构体的使用
- avi文件格式详解【转】
- [UOJ Round#4 A] [#51] 元旦三侠的游戏 【容斥 + 递推】
- 正则表达式:根据逗号解析CSV并忽略引号内的逗号
- XML CDATA
- WIN版的Jenkins Master加入LINUX的SLAVE节点,并作C++程序的集成交付
- 模拟键盘发送文字(使用SendInput函数)