1. 程式人生 > >【wikioi】2956-排隊問題

【wikioi】2956-排隊問題

有N個學生去食堂,可教官規定:必須2人或3人組成一組,求有多少種不同分組的方法。

方法1:dp(和爬樓梯那貨一樣),公式:f[i]=f[i-2]+f[i-3];

方法2:DFS,比較慢。

#include <iostream>
using namespace std;

long long ans=0;
long long temp_sum=0;
long long dp(int n)
{
    long long f[151]= {0};
    f[2]=f[3]=1;
    for(int i=4; i<=n; i++)
    {
        f[i]=f[i-2]+f[i-3];
    }
    return f[n];
}
void dfs(int n)
{
    if(temp_sum>n)
        return;
    if(temp_sum==n)
    {
        ans++;
    }
    else for(int i=2; i<=3; i++)
        {
            temp_sum+=i;
            dfs(n);
            temp_sum-=i;
        }
}
int main()
{
    int n=20;
    cout << "DP  " <<dp(n)<< endl;
    dfs(n);
    cout << "DFS  " <<ans<< endl;
    return 0;
}