zoukankan      html  css  js  c++  java
  • 【排列组合】

    ——前提提要:做排列组合题目的时候,要注意long long的问题!!!!
    题目一:有n封信,每封信都装错了对应的袋子里,问一共有几种“错误”形式?
    多组数据1<=n<=20
    例:2 3 输出:1 2
    题解:本题为简单错排题。直接套公式即可
    【注意要开long long,否则会爆】。

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    typedef long long ll;
    using namespace std;
    int f[22],n;
    ll fun(int n){
        if(n==1)return 0;
        if(n==2)return 1;
        return (ll)(n-1)*(fun(n-1)+fun(n-2));
    }
    int main(){
        while(scanf("%d",&n)!=EOF) 
              printf("%lld
    ",fun(n));
        return 0;
    }


    题目二:有n个数,顺次排列a[i]=i;问字典序第m个排列是什么?
    多组数据,1<=N<=1000, 1<=M<=10000
    例:6 4 输出:1 2 3 5 6 4
    11 8 1 2 3 4 5 6 7 9 8 11 10
    题解:本题目运用next_permutation(a+1, a+1+n);这个函数。
    所以代码如下:

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    typedef long long ll;
    using namespace std;
    int f[22],n;
    ll fun(int n){
        if(n==1)return 0;
        if(n==2)return 1;
        return (ll)(n-1)*(fun(n-1)+fun(n-2));
    }
    int main(){
        while(scanf("%d",&n)!=EOF) 
              printf("%lld
    ",fun(n));
        return 0;
    }

    题目三:结婚典礼上,有n对新婚夫妇。玩一个新郎找新娘的游戏,有m个新郎找错了,一共有多少种可能?t组数据,1<=m<=n<=20;
    例:2 输出:1
    2 2 3
    3 2
    题解:错排+组合题。组合(杨辉三角),错排()因为有m个新郎选错了新娘,所以有n-m个新郎选对了新娘,所以可套用杨辉三角公式得到[函数见下面程序] sun(n,n-m),错排就不用说了,fun(m);根据乘法原理,选对的方法*选错的方法=最终选的可能数√

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    typedef long long ll;
    using namespace std;
    int n,m,t;
    ll fun(int n){//错排 
        if(n==1)return 0;
        if(n==2)return 1;
        return (ll)(n-1)*(fun(n-1)+fun(n-2));
    }
    ll sun(int x,int y){//组合 
        if(y==0 || y==x) return (ll)1;
        return sun(x-1,y)+sun(x-1,y-1); 
    }
    int main(){
        //freopen("e.in","r",stdin);
        //freopen("e.out","w",stdout);
        scanf("%d",&t);
        while(t--){
            scanf("%d %d",&n,&m);
            ll a1=fun(m);
            ll a2=sun(n,n-m);
            cout<<a1*a2<<endl;
        }
        return 0;
    }
  • 相关阅读:
    C语言知识点
    VS Studio 相关知识点
    类——继承、复合、委托
    类(传入的形参为指针形式)-字符串的实现
    类(传入的形参为非指针形式)-复数的实现
    C++需要掌握的重点内容
    目标跟踪相关资料
    夏天在威海,冬天在昆明
    短时目标跟踪
    php实现中文反转字符串的方法
  • 原文地址:https://www.cnblogs.com/wuhu-JJJ/p/11161270.html
Copyright © 2011-2022 走看看