Cpp环境【Vijos1060】斯特林数:盒子与球

该博客介绍了如何解决Vijos1060问题,即在斯特林数背景下,如何计算在有限的红球和蓝球条件下,将它们放入n个盒子的不同方法数。博主首先提出了暴力回溯的解决方案,然后逐步优化,通过递推算法降低时间复杂度,最终实现了从五重循环到两重循环的优化,适用于更大规模的问题。博客还提及了斯特林数的概念及其在问题中的应用。
摘要由CSDN通过智能技术生成
【问题描述】      

  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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值