V 排列組合 HDU 1521

2021-09-03 07:12:44 字數 1870 閱讀 2945

有n種物品,並且知道每種物品的數量。要求從中選出m件物品的排列數。例如有兩種物品a,b,並且數量都是1,從中選2件物品,則排列有"ab","ba"兩種。

input

每組輸入資料有兩行,第一行是二個數n,m(1<=m,n<=10),表示物品數,第二行有n個數,分別表示這n件物品的數量。

output

對應每組資料輸出排列數。(任何運算不會超出2^31的範圍)

sample input

2 2

1 1

sample output

2
分析:

第一看出是就是dp

dp[i][j]含義:可以從前i個物品中選出j個的排列種類數

加法原理:第n個物品使用了k個,0<=k<=tot[i]

那麼使用第n個物品時有:

d p[

n][m

]=∑c

[m][

k]∗d

p[n−

1][m

−k],

0<=k

<=t

ot[i

]dp[n][m]=\sum c[m][k]*dp[n-1][m-k] ,0<=k<=tot[i]

dp[n][

m]=∑

c[m]

[k]∗

dp[n

−1][

m−k]

,0<=k

<=t

ot[i

]

所以dp方程為:

d p[

i][j

]=∑c

[j][

k]∗d

p[i−

1][j

−k],

0<=k

<=t

ot[i

]dp[i][j]=\sum c[j][k]*dp[i-1][j-k] ,0<=k<=tot[i]

dp[i][

j]=∑

c[j]

[k]∗

dp[i

−1][

j−k]

,0<=k

<=t

ot[i

]

#include

#include

#include

#include

#include

#include

#include

#include

#define mset(a,b) memset(a,b,sizeof(a))

using

namespace std;

typedef

unsigned

long

long ull;

typedef

long

long ll;

const

int maxn=

2e4+10;

const

int branch=26;

const

int inf=

0x3f3f3f3f

;const

int mod=

1e6+7;

int c[30]

[30];

int dp[20]

[20],tot[20]

;int n,m;

//從n個物品中選m個數

void

init()

//求排列組合

}int

solve()

}return dp[n]

[m];

}int

main()

}

hdu 1521 排列組合

題意 problem description 有n種物品,並且知道每種物品的數量。要求從中選出m件物品的排列數。例如有兩種物品a,b,並且數量都是1,從中選2件物品,則排列有 ab ba 兩種。input 每組輸入資料有兩行,第一行是二個數n,m 1 m,n 10 表示物品數,第二行有n個數,分別表...

HDU 1521(排列組合)

母函式題,求排列使用指數型母函式,套用母函式模板即可。include include using namespace std const int maxn 15 int fac maxn 階乘 int num maxn double c1 maxn c2 maxn 計算10以內的階乘 void ge...

hdu1521 排列組合母函式)

problem description 有n種物品,並且知道每種物品的數量。要求從中選出m件物品的排列數。例如有兩種物品a,b,並且數量都是1,從中選2件物品,則排列有 ab ba 兩種。input 每組輸入資料有兩行,第一行是二個數n,m 1 m,n 10 表示物品數,第二行有n個數,分別表示這n...