迭代加深搜索POJ 3134 Power Calculus
2024-09-20 02:16:29
题意:输入正整数n(1<=n<=1000),问最少需要几次乘除法可以从x得到x的n次方,计算过程中x的指数要求是正的。
题解:这道题,他的结果是由1经过n次加减得到的,所以最先想到的就是暴力回溯,其中的剪枝函数,首先不能得到重复的数,其次深度有上限,上限是n-1,还有,如果当前序列的最大数乘以2的(dep-cnt)(dep与cnt分别表示深度上限和当前深度)次方小于n,则剪枝。但是这样的时间复杂度还是特别高,所以又想到了另外的方法,就是先列出深度,然后找在这个深度里是否存在一个方法得到n
代码:
#include<math.h>
#include<vector>
#include<string.h>
#include<stdio.h>
#include<iostream>
using namespace std;
const int maxn=;
int n,minn,dep;
int ans[maxn]; bool dfs(int num,int cnt){
if(cnt==dep){
if(num==n)
return ;
return ;
}
if(num*(<<(dep-cnt))<n) return ;
for(int i=cnt;i>=;i--){
ans[cnt+]=ans[i]+num;
if(dfs(ans[i]+num,cnt+)){
return ;
}
if(ans[i]<num){
ans[cnt+]=num-ans[i];
if(dfs(num-ans[i],cnt+)){
return ;
}
}
else if(ans[i]<num){
ans[cnt+]=ans[i]-num;
if(dfs((ans[i])-num,cnt+))
return ;
}
}
return ;
} //bool dfs(int num,int cnt){
// if(num==n){
// return 1;
// }
// if(cnt==dep){
// return 0;
// }
// if(num*(1<<dep-cnt)<n) return 0;
// for(int i=0;i<=cnt;i++){
// for(int j=1;j<=2;j++){
// if(j==1){
// ans[cnt+1]=num+ans[i];
// if(dfs(num+ans[i],cnt+1)){return 1;}
// }
// else{
// ans[cnt+1]=num-ans[i];
// if(num-ans[i]<0) continue;
// if(dfs(num-ans[i],cnt+1)) return 1;
// }
// }
// }
// return 0;
//} int main(){
//freopen("in.txt","r",stdin);
while(scanf("%d",&n)&&n){
minn=;
memset(ans,,sizeof(ans));
ans[]=;
for(dep=;dep<=;dep++){
if(dfs(,))
break;
}
printf("%d\n",dep);
}
}
最新文章
- C语言的文法分析
- effetive C++ 02 尽量以const,enum,inline替换#define
- mysql的sql_mode 模式修改 my.cnf
- 树状数组POJ2352星星
- 430单片机之定时器A功能的大致介绍
- Java HashMap 源码解析
- 使用libsvm对MNIST数据集进行实验
- Entity Framework 的枚举类型
- IE标签a嵌套table标签,链接点击无效
- CodeForces 705C Thor
- BOM—浏览器对象模型(Browser Object Model)
- resful
- HDU 5583 Kingdom of Black and White(暴力)
- Linux:服务器/客户端API调用错误检查
- ROW_NUMBER() OVER(PARTITION BY ORDER BY )RN 只选一行
- CentOS 查看是否安装软件包
- 用 IIS 搭建 mercurial server
- Intellij IDEA Scala开发环境搭建
- [转][Java]Jsp入门
- Problem-1000:A + B Problem
热门文章
- Android 开发笔记___复选框__checkbox
- [MYSQL] 记一次MySQL性能调优
- Pycharm,Python原生IDE?
- w3wp.exe已附加有调试器,但没有该调试器配置为调试此未经处理的异常,若要调试此异常,必须分离当前的调试器。
- 如何部署Java_web项目到云服务器上
- 用python模拟登录(解析cookie + 解析html + 表单提交 + 验证码识别 + excel读写 + 发送邮件)
- c#基础知识索引器
- CentOS7.x系统根目录分区扩容
- R语言高性能编程(二)
- 什么是Node.js?带你初识Node