递归的题解 https://vjudge.net/contest/154741

A - 母牛的故事 
#include<iostream>
using namespace std;
long long  a[100];
int main()
{
  int n;
  while(cin>>n)
  {
    a[1]=1;a[2]=2;a[3]=3;a[4]=4;
    if(n==0) break;
    if(n<=4) cout<<n<<endl;
    else
    {
      for(int i=5;i<=n;i++)
      {
        a[i]=a[i-1]+a[i-3];
      }
      cout<<a[n]<<endl;
    }
  }
  return 0;
}
————————————————————————————————————————————
B - Fibonacci Again 
#include<iostream>
using namespace std;
int a[10000004];
int main()
{
  int n;
  a[0]=1;
  a[1]=2;
  for(int i=2;i<=1000000;i++)
  {
    a[i]=(a[i-1]+a[i-2])%3;
  }
  while(cin>>n)
  {
    if(a[n]==0) cout<<"yes"<<endl;
    else cout<<"no"<<endl;
  }
  return 0;
}
——————————————————————————————————————————————
C - Prime Ring Problem 
1.
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int a[22],b[22],mark[22];
int prime(int x)//判断是否是素数
{
  int o=sqrt(x);
  if(x==1 || x==4) return 1;
  if(x==2 || x==3) return 0;
  for(int i=2;i<=o;i++)
  {
    if(x%i==0) return 1;
  }
  return 0;
}
void print(int n,int b[])//输出
{
  for(int i=1;i<=n;i++)
  {
    if(i!=1) cout<<' ';
    cout<<b[i];
  }
  cout<<endl;
}
int judge(int front,int last,int k,int n)//递归判断素数环
{
  if(prime(front+last)) return 0;
  b[k]=last;
  if(k==n && !prime(last+1))
  {
    print(n,b);
    return 1;
  }
  mark[last]=0;//标记是该数在子函数内不能在出现,但是回归主函数时必须释放
  for(int i=2;i<=n;i++)
  {
    if(mark[i] && judge(last,i,k+1,n)) break;
  }
  mark[last]=1;
  return 0;
}
int main()
{
  int count=1,n;
  while(cin>>n)
  {
    for(int i=1;i<=n;i++)
    {
      mark[i]=1;
    }
    b[1]=1;
    cout<<"Case "<<count++<<":"<<endl;
    if(n==1) cout<<n<<endl;//1单独输出
    else
    for(int i=2;i<=n;i++)
    {
      judge(1,i,2,n);
    }
    cout<<endl;
  }
  return 0;
}
2.
#include <iostream>
#include <algorithm>
#include<cmath>
using namespace std;
int a[30],vis[30];
int prime(int x)//判断是否是素数
{
  int o=sqrt(x);
  if(x==1 || x==4) return 1;
  if(x==2 || x==3) return 0;
  for(int i=2;i<=o;i++)
  {
    if(x%i==0) return 1;
  }
  return 0;
}

void dfs(int n,int m){

    if(n>m && prime(a[1]+a[m])==0){
        for(int i=1;i<=m;i++){
            if(i!=1) cout<<' ';
            cout<<a[i];
        }
        cout<<endl;
    }

    for(int i=2;i<=m;i++){
        if(vis[i]==0){
            a[n]=i;
            if(n==1 || (prime(i+a[n-1])==0)){
                    vis[i]=1;
                    dfs(n+1,m);
                    vis[i]=0;

            }
        }
    }

}
int main(){

    int n,count=1;
    while(cin>>n){
      cout<<"Case "<<count++<<":"<<endl;
    a[1]=1;
    vis[1]=1;
    dfs(2,n);
    cout<<endl;
  }
  return 0;
}
——————————————————————————
D - 一只小蜜蜂... 
#include<iostream>
using namespace std;
__int64 a[52];
int main()
{
  __int64 N,c,b,i;
  a[0]=1;
  a[1]=1;
  for(i=2;i<=50;i++)
  {
    a[i]=a[i-1]+a[i-2];
  }
  cin>>N;
  while(N--)
  {
    cin>>c>>b;
    cout<<a[b-c]<<endl;
  }
  return 0;
}
————————————————————————————————————
E - Children’s Queue 
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=1100;
int a[maxn][maxn];
int main()
{
  int n,i,j;
  memset(a,0,sizeof(a));
  a[0][0]=0;
  a[1][0]=1;
  a[2][0]=2;
  a[3][0]=4;
  a[4][0]=7;
  for(i=5;i<=1001;i++)
  {
    for(j=0;j<=1007;j++)
    {
      a[i][j]+=(a[i-1][j]+a[i-2][j]+a[i-4][j]);
      if(a[i][j]>=10)
      {
        int h=a[i][j];
        a[i][j]=h%10;
        a[i][j+1]+=(h/10);
      }
    }
  }
  while(cin>>n)
  {
    for(i=1007;i>=0;i--)
    {
      if(a[n][i]) break;
    }
    for( ;i>=0;i--)
    {
      cout<<a[n][i];
    }
    cout<<endl;
  }
  return 0;
}
——————————————————————————————————
——————————————————————————————————————————
F - Problem B 
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=1100;
int a[maxn][maxn];
int main()
{
  int n,i,j;
  memset(a,0,sizeof(a));
  a[0][0]=0;
  a[1][0]=1;
  a[2][0]=2;
  a[3][0]=4;
  a[4][0]=7;
  for(i=5;i<=1001;i++)
  {
    for(j=0;j<=1007;j++)
    {
      a[i][j]+=(a[i-1][j]+a[i-2][j]+a[i-4][j]);
      if(a[i][j]>=10)
      {
        int h=a[i][j];
        a[i][j]=h%10;
        a[i][j+1]+=(h/10);
      }
    }
  }
  while(cin>>n)
  {
    for(i=1007;i>=0;i--)
    {
      if(a[n][i]) break;
    }
    for( ;i>=0;i--)
    {
      cout<<a[n][i];
    }
    cout<<endl;
  }
  return 0;
}
G题类似
————————————————————————————
H - 放苹果 
#include<iostream>
#include<cstring>
using namespace std;
int a[21][21];
int apple(int m,int n)
{
	if(a[m][n])return a[m][n];
	else if(m==1 || n==1)
	{
		a[m][n]=1;
		return a[m][n];
	}
    else if(m<n)
    {
        a[m][n]=apple(m,m);
        return a[m][n];
    }
    else if(m==n)
    {
        a[m][n]=1+apple(m,m-1);
        return a[m][n];
    }
    else
    {
        a[m][n]=apple(m-n,n)+apple(m,n-1);
        return a[m][n];
    }
} 
int main()
{
    int T,m,n;
    cin>>T;
    while(T--)
    {
        memset(a,0,sizeof(a));
        cin>>m>>n;
        cout<<apple(m,n)<<endl;
    }
    return 0;
}

Download as text

原文地址:https://www.cnblogs.com/163467wyj/p/6635794.html