【问题描述】
n 个盒子排成一行(编号为1..n)。你有A个红球和B个蓝球。球除了颜色没有任何区别。你可以将球放进盒子。一个盒子可以同时放进两种球,也可以只放一种,也可以空着。球不必全部放入盒子中。编程计算有多少种放置球的方法。
【输入格式】
一行,n,A,B,用空格分开。
【输出格式】
一行,输出放置方案总数。
【输入样例】
2 1 1
【输出样例】
9
【样例解释】
用一对括号表示一个盒子,R表示红色,B表示蓝色,有如下9种方案:
( ), ( )
(R ), ( )
(B ), ( )
(RB), ( )
(R ), (B )
(B ), (R )
( ), (R )
( ), (B )
( ), (RB)
【数据范围】
40% 数据满足:n<=10,A+B<=10
100%的数据满足:1<=n<=20 ,0<=A<=15 ,0<=B<=15
最后的答案不会超过 -1。
【来源】
NOIP提高组
Vijos1060原题传送矩阵
重庆一中题库原题传送矩阵
【思路梳理】
考试的时候因为边界问题纠结了很久=_+,想了一阵居然没有想通所以交了对拍程序拿了60分走人,现在回想起来还是很亏,给自己在这里留一个教训。
言归正传,关于这个题首先想到的肯定是回溯算法暴力枚举,run(i,j,k)=目前在考虑第i个盒子,前i-1个盒子中已经放入了j个红球,k个蓝球,那么依次枚举在这个盒子中放入x个红球,y个蓝球(0≤x≤A-j,0≤y≤B-k)的可行方案数:
unsigned long long solve(int i,int j,int k)//考虑第i个盒子,目前已总共放入j个红球,k个篮球
{
if(i>n) return 1;//所有盒子都考虑完了,是一种可行方案
long long cnt=0;//将各个可能的方案数加在一起求和
for(in