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;
}
} ```