标签:blog using eof poj ++ ace check out ==
题意:给出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(水)
标签:blog using eof poj ++ ace check out ==
原文地址:http://www.cnblogs.com/HIKARI1149/p/7029309.html