组合数打表法(1587: 爬楼梯)

这道题思路比较清晰,采用的方法是组合数打表法:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1587

(1587: 爬楼梯)

#include <iostream>

#define max 46

using namespace std;



long long c[max][max];

int main()

{

    for(int i = 0;i < max;i++){

        c[i][0]=1;

        c[i][i]=1;

    }

    for(int i = 1;i < max;i++){

        for(int j = 1;j < i;j++){

            c[i][j]=c[i-1][j] + c[i-1][j-1];

        }

    }

    /*

    for(int i = 0;i < max;i++){

        for(int j = 0;j < max;j++){

            cout<<c[i][j]<<" ";

        }

        cout<<endl;

    }

    */

    int t,z;

    cin>>t;

    while(t--){

        cin>>z;

        int m = z/2;

        long long count=0;

        //这个相当于一个排列组合的问题

        for(int i = 0;i <= m;i++)

        {

            count+=c[z-i][i];

        }

        cout<<count<<endl;



    }

    return 0;

}

 

你可能感兴趣的:(组合)