6/29
粗浅地学习了一下IDA*,感觉上来说,IDA *的核心部分就是它的估价函数,设计正确的估价函数,以此可以大大减小搜索树的规模。这种算法尝用于搜索树的边界并不明确,需要迭代加深搜索的这一类题目。——小记
1.快速幂计算uva1374
(之前也学过快速幂,通过二进制分解等方法来求解,当然,也可以采用迭代加深搜索算法求解)
- 快速幂最根本的就是利用当前求得的数进行乘积计算,以此达到快速得到幂的结果。很容易得出,我们可以把当前求出的幂的种类作为状态(用指数间的加减求得最后的结果)
- 迭代加深,枚举maxd,即最大步数,如果能成功,就break,输出maxd即可
- 对于当前所求得的每一个幂的指数,可以选择加(即乘),可以选择减(即除),结果当然应该是合法的
点击查看代码
#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();
}
}