poj2248 Addition Chains(迭代加深)
阿新 • • 發佈:2018-12-10
題目
題解
迭代加深當搜尋樹的分支隨深度增大得很快的時候,最適合用迭代加深。 設定一個dep限制搜尋深度,一旦到達dep立刻回溯。 dep逐漸增大,逼近答案。儘管每次都會重複搜尋部分分支,因為最終的dep比較小,影響不大。
這題正好符合迭代加深的要求:搜尋樹每個節點擴充套件的情況很多,且答案節點位置較淺。 注意去除冗餘狀態,優先往大的X擴充套件。
程式碼
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=110; int n,dep; int a[maxn]; bool dfs(int k) { if(k>dep) { if(a[dep]==n) return true; else return false; } bool v[maxn]={false}; for(int i=k-1;i>=1;i--) for(int j=k-1;j>=1;j--) { if(a[i]+a[j]<=a[k-1]) break; if(a[i]+a[j]<=n && !v[a[i]+a[j]]) { v[a[i]+a[j]]=true; a[k]=a[i]+a[j]; if(dfs(k+1)) return true; } } return false; } int main() { while(scanf("%d",&n),n!=0) { if(n==1){printf("1\n");continue;} dep=1; a[1]=1; while(1) { dep++; if(dfs(2)) { for(int i=1;i<dep;i++) printf("%d ",a[i]); printf("%d\n",a[dep]); break; } } } return 0; }