Vijos - 1060 盒子 遞推+優化 重慶一中高2018級競賽班第七次測試 2016.8.4 Problem 1

【問題描述】
N個盒子排成一行(1<=N<=20)。你有A個紅球和B個藍球。0 <= A <= 15, 0 <= B <= 15。球除了顏色沒有任何區別。你可以將球放進盒子。一個盒子可以同時放進兩種球,也可以只放一種,也可以空着。球不必全部放入盒子中。編程計算有多少种放置球的方法。

【輸入格式】
一行,N,A,B,用空格分開。

【輸出格式】
一行,輸出放置方案總數。

【輸入樣例】

2 1 1

【輸出樣例】

9

【樣例解釋】

用一對括號表示一個盒子,R表示紅色,B表示藍色,有如下9種方案:
(  ), (  )
(R ), (  )
(B ), (  )
(RB), (  )
(R ), (B )
(B ), (R )
(  ), (R )
(  ), (B )
(  ), (RB)

思路:
求方案數一般都使用遞推。因爲紅球與藍球互不影響,可以將兩種球分開來看。設f[i][j]:前i個盒子放不超過j個球的方案數。
狀態轉移方程見代碼。
邊界:f[0][j]=1 (0<=j<=max(A,B))
考試的時候錯以爲一個盒子最多放兩個球。

/*
    Name: box.cpp
    Copyright: Twitter & Instagram @stevebieberjr
    Author: @stevebieberjr
    Date: 05-08-16 10:07
*/
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;

int n,A,B;
unsigned long long f[25][20]; //f[i][j]:前i個盒子放不超過j個球的方案數 

int main()
{
    freopen("box.in","r",stdin);
    freopen("box.out","w",stdout);
    scanf("%d%d%d",&n,&A,&B);
    memset(f,0,sizeof(f));
    for(int j=0;j<=A || j<=B;j++)
    {

        f[0][j]=1;
    }

    for(int i=1;i<=n;i++)
    {
        unsigned long long t=0; 
        for(int j=0;j<=A || j<=B;j++)
        {
            t+=f[i-1][j];
            f[i][j]=t;
        }
    }

    cout<<f[n][A]*f[n][B]<<endl;

    return 0;
}
發佈了74 篇原創文章 · 獲贊 7 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章