迭代加深搜索专题

Addition Chains POJ - 2248

题目思路
首先你得知道什么是迭代加深搜索吧!这个自行上网查阅一下
显然普通的bfs,dfs都不行
那我们就先确定了深搜层数(就是几个数),再在这个层数上进行搜索
(其实其他关于迭代深搜的讲的更清楚)

迭代深搜剪枝很重要

关键点
1.确定最少层数:每次都是前面那个数的2倍这样扩展就能够计算出最少层数
2.在宽搜的过程中,如果这个以后的数选择都是前面一个数*2,但最后结果也小于a,那么就可以直接减去。

感觉有点眉目了

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<set>
//迭代深搜
using namespace std;
int ans[1000],t,flag,a;
void sou(int s){
	if(s==t+1){
		if(ans[t]==a)
		flag=1;
		return ;
	}
	else{
		if(ans[s-1]<<(2,t-s+1)<a)
		return ;
		/*就算后面的数每次都选最大
		就是等于前面两倍也不够,就直接退出*/
	for(int i=s-1;i>=1;i--)
		for(int j=i;j>=1;j--){
			ans[s]=ans[i]+ans[j];
		if(ans[s]<=ans[s-1])
		continue;
		sou(s+1);
		if(flag==1)
		return ;
		}
	}
}
int main(){
	while(scanf("%d",&a)&&a){
		flag=0;
		int p=1;
		t=1;
		while(p<a){
			p*=2;
			t++;
		}
		//至少扩展t次
		ans[1]=1;
		for(t;;t++){
			sou(2);
			if(flag==1)
			break;
		}
		cout<<ans[1];
		for(int i=2;i<=t;i++)cout<<" "<<ans[i];
		cout<<endl; 
	}
} ```



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值