【问题描述】
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;
}