日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

排列组合(HDU-1521)

發布時間:2025/3/17 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 排列组合(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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。