POJ 2248 Addition Chains dfs(水)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 2248 Addition Chains dfs(水)相关的知识,希望对你有一定的参考价值。
题意:给出n 构成出满足下列条件 长度最小的数列
a[0]=1,a[m]=n, a[0]<a[1]<..<a[m]
每个下标k都存在(i,j<k) 满足:a[k]=a[i]+a[j]
n<=100
枚举长度 dfs爆搜+剪枝 水过,
#include <iostream> #include <cstring> #include <cstdio> using namespace std; const int N=2e5+20; int n,a[N],mk[N],ans; bool check(int len) { if(a[1]!=1) return false; for(int i=2;i<=len;i++) { bool flag=false; for(int k=1;k<=a[i]/2;k++) { if(mk[k]&&mk[a[i]-k]) flag=true; } if(flag==false) return false; } return true; } bool dfs(int cur,int len) { if(cur>len) return a[cur-1]==n; for(int i=cur-1;i>=1;i--) { for(int j=i;j>=1;j--) { int x=a[i]+a[j];//???ù???? if(x>a[cur-1]) { a[cur]=x; if(dfs(cur+1,len)) return true; } } } return false; } int main() { while(cin>>n&&n) { ans=0; memset(mk,0,sizeof(mk)); for(int len=1;len<=100;len++) { a[1]=1; mk[1]=1; if(dfs(2,len)) { ans=len; break; } } for(int i=1;i<=ans;i++) cout<<a[i]<<‘ ‘; cout<<endl; } return 0; }
以上是关于POJ 2248 Addition Chains dfs(水)的主要内容,如果未能解决你的问题,请参考以下文章
POJ 2248 Addition Chains dfs(水)