/*
一开始想到了简单的深搜 维护当前可用的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 ;
}

最新文章

  1. javascript之Object.defineProperty的奥妙
  2. 汗,Google又调整了编译工具(升级SDK先备份!!!)
  3. 获得Window窗口权限的三种方法
  4. Node.js~sails.js~package.json的作用
  5. Virtual Box常用指令
  6. SwipeRefreshLayout 首次打开出现加载图标
  7. rapid js framework
  8. [转载] Linux下多路复用IO接口 epoll select poll 的区别
  9. Loadrunner脚本之C语言文件处理函数
  10. URAL1635. Mnemonics and Palindromes(DP)
  11. 开发中遇到的angularJs的小问题
  12. Cannot declare class app\home\controller\Cases because the name is already in use
  13. HTML5可以省略全部标记的元素
  14. 99%的Linux运维工程师必须要掌握的命令及运用
  15. Javaweb里“容器“为何出现,应用在哪,未来发展趋势
  16. VS快捷键失效问题
  17. Django Rest framework基础使用之Request/Response
  18. Java的Unsafe类
  19. HDU6216
  20. AWT和Swing的关系

热门文章

  1. bzoj1855: [Scoi2010]股票交易
  2. windows下搭建PHP环境
  3. java-web-j2e学习建议路线
  4. STM32 枚举类型和结构体的使用
  5. avi文件格式详解【转】
  6. [UOJ Round#4 A] [#51] 元旦三侠的游戏 【容斥 + 递推】
  7. 正则表达式:根据逗号解析CSV并忽略引号内的逗号
  8. XML CDATA
  9. WIN版的Jenkins Master加入LINUX的SLAVE节点,并作C++程序的集成交付
  10. 模拟键盘发送文字(使用SendInput函数)