从现在开始,小编正式与你一起解决爬楼梯问题
问题1
假设你现在正在爬楼梯,楼梯有n级。每次你只能爬1级或者2级,那么你有多少种方法爬到楼梯的顶部?
分析
要想解决这个问题,很明显,你有俩个解决办法,一个是模拟人脑处理问题的办法,动态规划法,一种是与人脑思维方式相反的方法设X法…此处烧脑中ing…(递归法)
小编重点带你研究递归的方法,动态规划法对于这道题很遗憾我想不到实现的方法。
我们以5为例
这就是小编所有的走路的过程,虽然图画的有点丑,但就是那个意思,每次只能走一步或者两步。我们要想知道我们有5 个台阶,每次只能走一步或者两步的情况的总数,只需要最下面的和加起来就可以,我们现在来解决为什么下面的相加就可以。
1.一个最下面就是一个可行的方案对不对
2.只剩下一个台阶有1种可以走的办法。 ,只剩下2个台阶有两种可以走的办法。
下面附上我的程序代码
#include <iostream>
using namespace std;
int sum=0;
//n个台阶,每个台阶最多可以走4个
int function(int n){
if(n==0)
{
return 0;
}
else if(n==1)
{
sum+=1;
return 1;
}
else if(n==2)
{
sum+=2;
return 2;
}
else if(n>2)
return function(n-1)+function(n-2);
}
int main(){
int n;
cin>>n;
function(n);
cout<<sum<<endl;
return 0;
}
代码解释
读懂这张图,或许你对递归有了一定的认识,这就是树。将不能解决的东西待定以下,等到树梢的时候再解决就把所有的情况都解决了。
问题2
小明参加一个大题比赛,答对了,加4分,答错或不答扣1分,有25道题,得了70分,求答对了几道。
#include <iostream>
using namespace std;
int sum=0;
int count1=0;
int count=0;-
int function(bool n)
{
if(n==true)
{
count+=1;
sum+=4;
}
else
{
sum-=1;
}
}
int main()
{
for(int a=0;a<=1;a++)
{
for(int b=0;b<=1;b++)
{
for(int c=0;c<=1;c++)
{
for(int d=0;d<=1;d++)
{
for(int e=0;e<=1;e++)
{
for(int f=0;f<=1;f++)
{
for(int g=0;g<=1;g++)
{
for(int h=0;h<=1;h++)
{
for(int i=0;i<=1;i++)
{
for(int j=0;j<=1;j++)
{
for(int k=0;k<=1;k++)
{
for(int l=0;l<=1;l++)
{
for(int m=0;m<=1;m++)
{
for(int n=0;n<=1;n++)
{
for(int o=0;o<=1;o++)
{
for(int p=0;p<=1;p++)
{
for(int q=0;q<=1;q++)
{
for(int r=0;r<=1;r++)
{
for(int s=0;s<=1;s++)
{
for(int t=0;t<=1;t++)
{
for(int u=0;u<=1;u++)
{
for(int v=0;v<=1;v++)
{
for(int w=0;w<=1;w++)
{
for(int x=0;x<=1;x++)
{ for(int y=0;y<=1;y++)
{ sum=0;
count=0;
function(a);
function(b);
function(c);
function(d);
function(e);
function(f);
function(g);
function(h);
function(i);
function(j);
function(k);
function(l);
function(m);
function(n);
function(o);
function(p);
function(q);
function(r);
function(s);
function(t);
function(u);
function(v);
function(w);
function(x);
function(y);
if(sum==70)
{
if(count!=count1)
{
cout<<count<<endl;
count1=count;
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
return 0;
}
这种算法是不是相当暴力,不过这种算法是不是你也可以有启发,比如11111100000这是11种情况,前面6种答对,后面5种答错,你就可以用这种类似的算法求值。