6/29

粗浅地学习了一下IDA*,感觉上来说,IDA *的核心部分就是它的估价函数,设计正确的估价函数,以此可以大大减小搜索树的规模。这种算法尝用于搜索树的边界并不明确,需要迭代加深搜索的这一类题目。——小记

1.快速幂计算uva1374

(之前也学过快速幂,通过二进制分解等方法来求解,当然,也可以采用迭代加深搜索算法求解)

  1. 快速幂最根本的就是利用当前求得的数进行乘积计算,以此达到快速得到幂的结果。很容易得出,我们可以把当前求出的幂的种类作为状态(用指数间的加减求得最后的结果)
  2. 迭代加深,枚举maxd,即最大步数,如果能成功,就break,输出maxd即可
  3. 对于当前所求得的每一个幂的指数,可以选择加(即乘),可以选择减(即除),结果当然应该是合法的
点击查看代码
#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();
	}
	
}
posted @ 2022-06-29 21:57  腾云今天首飞了吗  阅读(19)  评论(0编辑  收藏  举报