1. 程式人生 > >洛谷 P1287 盒子與球

洛谷 P1287 盒子與球

blank p12 include tdi adg cst span bar 方案

P1287 盒子與球

題目描述

現有r個互不相同的盒子和n個互不相同的球,要將這n個球放入r個盒子中,且不允許有空盒子。問有多少種方法?

例如:有2個不同的盒子(分別編為1號和2號)和3個不同的球(分別編為1、2、3號),則有6種不同的方法:

技術分享圖片

輸入輸出格式

輸入格式:

兩個整數,n和r,中間用空格分隔。(0≤n, r≤10)

輸出格式:

僅一行,一個整數(保證在長整型範圍內)。表示n個球放入r個盒子的方法。

輸入輸出樣例

輸入樣例#1: 復制
3 2
輸出樣例#1: 復制
6
思路:動規。

f[i][j]=f[i-1][j-1]+f[i-1][j]*j;
把第i個球單獨放一個盒子,那方案數為把i-1個球放在j-1個盒子裏的方案數。
把第i個球隨意放,第i個球有j種放置方法,再乘上i-1放在j個盒子裏的方案數。
因為盒子有區分,最後在成一個階乘。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,r;
long long jc=1;
int f[11][11]={1};
int main(){ scanf("%d%d",&n,&r); for(int i=1;i<=n;i++) for(int j=1;j<=r;j++) f[i][j]=f[i-1][j-1]+f[i-1][j]*j; for(int i=2;i<=r;i++) jc*=i; cout<<f[n][r]*jc; }

 

洛谷 P1287 盒子與球