排列组合(HDU-1521)
生活随笔
收集整理的這篇文章主要介紹了
排列组合(HDU-1521)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Problem Description
有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
思路:指數型母函數模版題
Source Program
#include<iostream> #include<cstdio> #include<cstdlib> #include<string> #include<cstring> #include<cmath> #include<ctime> #include<algorithm> #include<utility> #include<stack> #include<queue> #include<vector> #include<set> #include<map> #define EPS 1e-9 #define PI acos(-1.0) #define INF 0x3f3f3f3f #define LL long long const int MOD = 1E9+7; const int N = 4000000+5; const int dx[] = {0,0,-1,1,-1,-1,1,1}; const int dy[] = {-1,1,0,0,-1,1,-1,1}; using namespace std;double num[15];//第i個物品有num[i]個 double a[15],b[15]; double fac(int n) { //求階乘double ans=1.0;for(int i=1; i<=n; i++)ans*=i;return ans; } int main() {int n,m;while(scanf("%d%d",&n,&m)!=EOF) {for(int i=1; i<=n; i++)cin>>num[i];memset(a,0,sizeof(a));memset(b,0,sizeof(b));for(int i=0; i<=num[1]; i++)//a[0]=1.0;a[i]=1.0/fac(i);for(int i=2; i<=n; i++) {for(int j=0; j<=m; j++) {for(int k=0; k<=num[i]&&j+k<=m; k++) {b[j+k]+=a[j]/fac(k);}}for(int j=0; j<=m; j++) {a[j]=b[j];b[j]=0;}}printf("%.0lf\n",a[m]*fac(m));}return 0; }?
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的排列组合(HDU-1521)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 动态规划 —— 线性 DP —— 最大
- 下一篇: 理论基础 —— 索引