1. 猴子吃桃问题
源代码:
#include <stdio.h>
int fun(int n)
{
if(n==1)
return 1;
else
return (fun(n-1)+1)*2;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
printf("%d\n",fun(n));
return 0;
}
程序截图:
2. h阶楼梯下楼问题(对比更容易理解的“n阶楼梯上楼问题”)
从楼上走到楼下共有h个台阶,其中每一步有3种走法:走1个台阶;走2个台阶;走3个台阶。问共有多少种下楼方案?
源代码:
法一:
#include <stdio.h>
int count;
int take[105]; //记录某一步所走步数
void Try(int i,int s) //求方案数
{
int j,k;
for(j=3;j>0;j--)
{
if(i>=j)
{
take[s]=j; //记录第s步走j个台阶
if(i==j) //如果已经到了楼下
{
count++;
printf("方案%d:",count);
for(k=1;k<=s;k++) //输出本方案的每一步
printf("%d ",take[k]);
printf("\n");
}
else
Try(i-j,s+1); //尚未走到楼下,再试剩下的台阶(递归调用)
}
}
}
int main()
{
int h;
while(scanf("%d",&h)!=EOF)
{
count=0;
Try(h,1);
printf("count=%d\n",count);
}
return 0;
}
法二:
#include <stdio.h>
int Try(int h)
{
if(h==1)
return 1;
else if(h==2)
return 2;
else if(h==3)
return 4;
else
return Try(h-1)+Try(h-2)+Try(h-3);
}
int main()
{
int h;
while(scanf("%d",&h)!=EOF)
printf("count=%d\n",Try(h));
return 0;
}
程序截图:
3. 分书问题
有编号为0~4的5本书,准备分给5个人A,B,C,D,E。每个人的阅读兴趣用一个二维数组描述,公式如下:
like[i][j]=1:i喜欢j书 ; 0:i不喜欢j书
写一程序,输出所有分书方案,让人人皆大欢喜。假定5个人对5本书的阅读兴趣如下:
0 1 2 3 4
A 0 0 1 1 0
B 1 1 0 0 1
C 0 1 1 0 1
D 0 0 0 1 0
E 0 1 0 0 1
源代码:
#include <stdio.h>
int take[5],n=0;
int like[5][5]={
{0,0,1,1,0},
{1,1,0,0,1},
{0,1,1,0,1},
{0,0,0,1,0},
{0,1,0,0,1}
};
int book[5]={0};
void Try(int i)
{
int j,k;
for(j=0;j<5;j++) //j-书号
{
if((like[i][j]) && (book[j]==0)) //满足分书条件时
{
take[i]=j; //把j号书给i
book[j]=1; //记录j号书已分
if(i==4) //i=4说明所有书均已被分完,输出方案
{
n++;
printf("第%d个方案:\n",n);
for(k=0;k<5;k++)
printf("%d号书分给%c ",take[k],k+'A');
printf("\n");
}
else //否则书还没有分完,继续给下一人分书
Try(i+1);
book[j]=0; //记录j书待分
}
}
}
int main()
{
n=0;
Try(n); //分书方案号预置0,开始分书过程
return 0;
}
程序截图: