60分求爬楼梯问题的解

weilong122 2006-02-16 09:48:45
假设楼梯有M节,一个人一不最多跨过N节,问有多少中方法(请给出代码)

如M = 4, N = 2;
则有5种方法(1,1,1,1) ;(1,1,2);(1,2,1);(2,1,1);(2,2)

...全文
299 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
du51 2006-02-17
  • 打赏
  • 举报
回复
我晕倒.
我花了一个多小时,做完了.看看,竟然是求多少种的.
算了,分不要了.还是贴上吧.我的一番苦心呀...
要知道,这一题是递归加重复全排......
晕死......




#include <iostream>
#include <cstdlib>
using namespace std;
int check(int n,int *number,int l)
{
int sum=0;
for(int i=0;i<l;i++)sum+=number[i]*(i+1);
if(sum==n)return 1;
return 0;
}
void show(int *number,int l)
{
int fenjie,sum=0,i,j,cc=0,t,k,*num;
for(i=0;i<l;i++)sum+=number[i];
if(!(num=new int[sum]))exit(1);
for(i=0;i<l;i++)for(j=0;j<number[i];j++)num[cc++]=i+1;
bool bb=true;
k=sum-1;
while(bb)
{
i=0;
while(i<k)cout<<num[i++]<<' ';
cout<<num[i++]<<endl;
fenjie=k;
while(fenjie>0&&num[fenjie-1]>=num[fenjie])fenjie--;
if(fenjie)
{
j=k;
while(num[j]<=num[fenjie-1]) j--;
i=num[j]; num[j]=num[fenjie-1]; num[fenjie-1]=i;
i=fenjie+k;
for(j=fenjie;j<=i/2;j++)
{
t=num[j];
num[j]=num[i-j];
num[i-j]=t;
}
}
else bb=false;
}
delete []num;
}
void make(int n,int l,int limit,int *number)
{
if(check(n,number,l)){show(number,l);return;}
if(l>=limit)return;
for(int i=0;i<=n/(l+1);i++)
{
number[l]=i;
make(n,l+1,limit,number);
}
}
int main()
{
int n,limit;
cout<<"请输入总节数和最大节数"<<endl;
cin>>n>>limit;
int *number=new int[limit];
for(int i=0;i<limit;i++)number[i]=0;
make(n,0,limit,number);
delete []number;
system("PAUSE");
return 0;
}

/*DEV-C++
请输入总节数和最大节数
5
3
2 3
3 2
1 2 2
2 1 2
2 2 1
1 1 3
1 3 1
3 1 1
1 1 1 2
1 1 2 1
1 2 1 1
2 1 1 1
1 1 1 1 1
请按任意键继续. . .
*/
/*
主要是楼主把东西写出来了,我以为是求详细的步骤呢.....今天真的是狂无语.
*/

weilong122 2006-02-17
  • 打赏
  • 举报
回复
谢谢
各位了
weilong122 2006-02-17
  • 打赏
  • 举报
回复
弄错了
给错分了
iamcaicainiao 2006-02-17
  • 打赏
  • 举报
回复
你那个min,max一开始搞得我好费解,哈哈哈。
iamcaicainiao 2006-02-17
  • 打赏
  • 举报
回复
继续解释,假设楼梯6,每步2。
数组里得到的是1,2,3,5,8。

即在每步2的前提下:

只有1个台阶就1种方法。
1

只有2个台阶就2种方法。
1,1,
2,

只有3个台阶就3种方法。
1,1,1,
1,2,
2,1,

只有4个台阶的就5种方法。
1,1,1,1
2,1,1,
1,2,1,
1,1,2,,
2,2,

只有5个台阶的就8种方法
……
不一一列举
……

只有6个台阶的就13种方法
……
不一一列举
……

分析发现,每步2的前提下。
台阶1,2,3,4,5,6

方法1,2,3,5,8,13
后一个台阶方法 = 前2个台阶方法个数之和。

问题得解。

进一步分析发现:
每步x的时候,
后一个台阶方法 = 前x个台阶方法之和

哈哈,全剧终。
iamcaicainiao 2006-02-17
  • 打赏
  • 举报
回复
接着你的继续说吧,
3个的。
f[n]=f[n-1]+f[n-2]+f[n-3] //(n>3)
……

m个的。
f[n]=f[n-1] + f[n-2] + f[n-3] + …… +f[n-m] //(n>m)
TheBadTouch 2006-02-17
  • 打赏
  • 举报
回复
2个的说吧
f[0]=1;
f[1]=1;
f[2]=f[0]+f[1]
f[n]=f[n-1]+f[n-2](n>2)
n个的依次类推
arden1019 2006-02-17
  • 打赏
  • 举报
回复
TheBadTouch(iamsleepy - 一睡不醒) good idea
iamcaicainiao 2006-02-17
  • 打赏
  • 举报
回复
TheBadTouch(iamsleepy - 一睡不醒)
说说你的思路呢?
TheBadTouch 2006-02-17
  • 打赏
  • 举报
回复
no...it is a dp
TheBadTouch 2006-02-16
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <memory.h>
#define min(A,B) (A<B?A:B)
#define max(A,B) (A>B?A:B)

typedef unsigned __int64 int64;//自己根据编译器改,gcc就是unsigned long long

int main(){
int64 f[1025]; //最多一次阶梯这里1024啦(m<1025)
memset(f,0,sizeof(f));
f[0]=1;
int i,j,m,n;
scanf("%d%d",&m,&n);
for(i=1;i<=m;i++)
for(j=1;j<=min(i,n);j++)
f[i]+=f[max(0,i-n+j-1)];
printf("%I64u\n",f[m]);
return 0;
}
至于怎么求更大自己改……

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧