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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值