有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個的排列種類數所以dp方程為:加法原理:第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
]
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...