我在做这道题的时候首先用的是回溯法,但是交上地 时候显示超时,下面我把用回溯法的代码贴出来。
#include <stdio.h>
#include <math.h>
int n,flag=0;
int b[100],a[100];
int main()
{
void f(int x);
int i,j,m,t;
scanf("%d",&n)!=EOF
flag=0;
for(i=1;i<=n;i++)
{
a[i]=1;
}
b[1]=1;
if(n>=2)
{
f(2);
}else
{
flag=1;
}
printf("%d ",flag);
return 0;
}
void f(int x)
{
int i,j;
for(i=2;i<=n;i++)
{
if(a[i]==1&&abs(b[x-1]-i)<=2)
{
b[x]=i;
a[i]=0;
if(x<n)
{
f(x+1);
}else
{
flag+=1;
}
a[i]=1;
}
}
}
代码:
#include <stdio.h>
int main()
{
int i,j,n,m,s,t;
int a[100];
a[1]=1;a[2]=1;a[3]=2;
scanf("%d",&n);
for(i=4;i<=n;i++)
{
a[i]=a[i-1]+a[i-3]+1;
}
printf("%d\n",a[n]);
return 0;
}