Problem Description
有n种物品,并且知道每种物品的数量。要求从中选出m件物品的排列数。例如有两种物品A,B,并且数量都是1,从中选2件物品,则排列有”AB”,”BA”两种。

Input
每组输入数据有两行,第一行是二个数n,m(1<=m,n<=10),表示物品数,第二行有n个数,分别表示这n件物品的数量。

Output
对应每组数据输出排列数。(任何运算不会超出2^31的范围)


输入样例

2 2
1 1

输出样例

2
注意取整应该在结束时,即乘上f[m]后
#include<bits/stdc++.h>
using namespace std;
const int N=110;
double a[N],f[N],c1[N],c2[N];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int n,m;
    f[0]=1;
    for(int i=1;i<=10;++i)
        f[i]=i*f[i-1];
    while(cin>>n>>m)
    {
        memset(c1,0,sizeof(c1));
        memset(c2,0,sizeof(c2));
        for(int i=1;i<=n;++i)
          cin>>a[i];
        for(int i=0;i<=a[1];++i)
            c1[i]=1/f[i];
        for(int i=2;i<=n;++i)
        {
           for(int j=0;j<=m;++j)
              for(int k=0;j+k<=m&&k<=a[i];++k)
                c2[j+k]+=c1[j]/f[k];
            for(int j=0;j<=m;++j)
            c1[j]=c2[j],c2[j]=0;
        }
        long long ans=round(c1[m]*f[m]);//每一个单独的组合都要乘f[m]
        cout<<ans<<'\n';
    }
    return 0;
}

 

 posted on 2023-01-27 10:35  ruoye123456  阅读(116)  评论(0编辑  收藏  举报