【問題描述】
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;
}