UVA 1374 ——Power Calculus(IDA*搜索)
来源:互联网 发布:晋中干部网络培训平台 编辑:程序博客网 时间:2024/06/08 02:27
题目链接:点击打开链接
题目大意:求出x^1最少经过多少次相乘或者相除的运算才能到达x^n
解题思路:枚举可能的次数,将其作为深度,然后对每一个深度进行DFS,看看在这个最大深度内能不能达到所要求的目的
其中还要遇到剪枝问题,很典型的IDA*搜索
乐观估价函数 :( 当前的最大值 )* 2 ^(最大深度 - 当前深度)< (目标) 无可能,因为2 ^(最大深度 - 当前深度)是到达最大的数值
代码:
#include<bits/stdc++.h>using namespace std;int n;int a[1010];int cnt;int Pow(int x){ int ans = 1; int base = 2; while(x > 0) { if(x & 1) ans *= base; x >>= 1; base *= base; } return ans;}int maxd;bool dfs(int d, int num){ //if((num*Pow(maxd-d)) < n) return false; //一直找的错原来在这里, if((num*Pow(maxd-d+1)) < n) return false; //因为d是从1开始的,其实当前的深度应为(d-1)所以。。。 if(num <= 0) return false; if(d > maxd + 1) return false; if(num == n) return true; for(int i = 0; i < d; i++) { a[d] = num + a[i]; if(dfs(d+1, a[d])) return true; a[d] = num - a[i]; if(dfs(d+1, a[d])) return true; } return false;}int solve(){ for(int i = 0; i <= 1000; i++) { maxd = i; if(dfs(1, 1)) return i; }}int main(){ while(scanf("%d", &n) && n != 0) { a[0] = 1; int ans = solve(); printf("%d\n", ans); } return 0;}
阅读全文
0 0
- UVA 1374 ——Power Calculus(IDA*搜索)
- UVa 1374 - Power Calculus(IDA*)
- UVa 1374:Power Calculus(IDA*)
- UVA 1374 Power Calculus(IDA*)
- UVa 1374 - Power Calculus <IDA*算法>
- UVA - 1374 Power Calculus(IDA*+剪枝)
- UVa 1374 Power Calculus
- UVA 1374 Power Calculus
- UVA - 1374 Power Calculus
- uva 1374 Power Calculus
- uva 1374 power calculus
- UVA 1374 Power Calculus
- uva 1374 Power Calculus
- UVA 1374 Power Calculus(迭代深搜)
- UVA UVA - 1374 Power Calculus 快速幂计算(迭代加深搜索)
- poj 3134 Power Calculus (IDA*)
- poj3134 Power Calculus IDA*
- UVA 1374 - Power Calculus(迭代深搜)
- poj -- 1088 滑雪 【简单深搜】
- 【矩阵快速幂】LightOJ_1132_Summing up Powers
- 【C语言】【unix c】编译过程
- 白话经典算法系列
- 在cmd中输入ls命令出现“ls不是内部或外部命令解决
- UVA 1374 ——Power Calculus(IDA*搜索)
- PAT--1045. Favorite Color Stripe(LIS)
- POJ
- tyvj 4757 Cleaning 用最少的线段覆盖全区间 贪心 小优化
- 微信支付心得
- 【系统学习SpringBoot】springBoot +IDEA 热部署
- Kerberos 安装与配置 (七)
- Buns CodeForces
- keras中文文档笔记1——概述