可重复选择的组合-vijos1060 盒子

来源:互联网 发布:电子教室软件免费版 编辑:程序博客网 时间:2024/06/03 04:41

描述

N个盒子排成一行(1<=N<=20)。你有A个红球和B个蓝球。0 <= A <= 15, 0 <= B <= 15。球除了颜色没有任何区别。你可以将球放进盒子。一个盒子可以同时放进两种球,也可以只放一种,也可以空着。球不必全部放入盒子中。编程计算有多少种放置球的方法。
格式

输入格式

一行,N,A,B,用空格分开。
输出格式

一行,输出放置方案总数。
样例1

样例输入1

2 1 1
Copy
样例输出1

9
Copy
限制

1s
来源

Ural
Xiaomengxian

可以先只考虑一种球 因为可以一个盒子都不放,我们把这种情况看成是在旁边多加一个盒子,把所有球放进去

上网查了些资料 这是组合数学中的球盒模型
属于有关重复元素的组合问题
没学过 在这里整理一下

首先是重复元素的排列
运用到的是分步计数原理

1.一般地,从n个元素中取出m个可以重复的元素组成排列,第一个元素有n种取法,第二个元素也有n种取法……一共的排列数为 nm
比如,用1~9这10个数,可以组成1010个十位数

2.对于此题,球是重复的,但并非只有一种,这里相当于n个不同元素 选A个出来 乘上n个不同元素 选B个 可以重复选择的方案数,此外,还可以不选,就想当于n个箱子排成一排,外面再多放一个箱子,不放球的时候全部仍到那个箱子里,故一共为C(A+n,n)*C(B+n,n)

#include <bits/stdc++.h>using namespace std;typedef unsigned long long ull;ull c[50][50];int main(){    int n,a,b;    for(int i=0;i<=40;i++) c[i][0]=1;    for(int i=0;i<=40;i++){        for(int j=1;j<=i;j++)           c[i][j]=c[i-1][j-1]+c[i-1][j];    }    cin>>n>>a>>b;    cout<<c[a+n][n]*c[b+n][n]<<endl;}
原创粉丝点击