1. 程式人生 > >POJ 2248 Addition Chains dfs(水)

POJ 2248 Addition Chains dfs(水)

true const bool chains addition blog 條件 題意 sin

題意:給出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(水)