zoukankan      html  css  js  c++  java
  • goj 错排(递推dp)

    Problem Description:

    今年暑假GOJ集训队第一次组成女生队,其中有一队叫RPG,但做为集训队成员之一的野骆驼竟然不知道RPG三个人具体是谁谁。RPG给他机会让他猜猜,第一次猜:R是公主,P是草儿,G是月野兔;第二次猜:R是草儿,P是月野兔,G是公主;第三次猜:R是草儿,P是公主,G是月野兔;......可怜的野骆驼第六次终于把RPG分清楚了。由于RPG的带动,做ACM的女生越来越多,我们的野骆驼想都知道她们,可现在有N多人,他要猜的次数可就多了,为了不为难野骆驼,女生们只要求他答对一半或以上就算过关,请问有多少组答案能使他顺利过关。
    

    Input:

    输入的数据里有多个case,每个case包括一个n,代表有几个女生,(n<=20), n = 0输入结束。

    Output:

    输出能使野骆驼过关的组数。

    Sample Input:

    1
    2
    0
    

    Sample Output:

    1
    1
    解题思路:错排(递推)+排列组合,比较基础。
    AC代码:
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long LL;//采用long long是避免相乘过程中数据溢出
     4 using namespace std;
     5 LL C(int n,int m)//组合数求组合数c(n,m)
     6 {
     7     LL ans=1;
     8     for(int i=1;i<=m;i++)
     9         ans=ans*(n-i+1)/i;//求组合数的技巧
    10     return ans;
    11 }
    12 int main()
    13 {
    14     int n;
    15     LL a[15]={0,0,1},sum;//题目允许最多错排10个,所以数组长度开15足够了
    16     for(int i=3;i<15;i++)
    17         a[i]=(i-1)*(a[i-1]+a[i-2]);//错排公式
    18     while(cin>>n && n){
    19         sum=1;//表示0个错排,即全猜对了,这是其中的一种情况,所以sum从1开始
    20         for(int i=1;i<=n/2;i++)//从1~n/2这里选择i个进行错排,即为题目要求的答案
    21             sum+=C(n,i)*a[i];
    22         cout<<sum<<endl;
    23     }
    24     return 0;
    25 }
     
  • 相关阅读:
    百度云盘下载限速破解
    (五)Struts之Action类基础(二)
    (四)Decorator设计模式解决GET/POST请求的乱码问题(转)
    (三)Struts之Action类基础(一)
    (二)Struts.xml文件详解
    (一)Struts2 基础
    (三十一)web 开发基础项目
    mysql的索引
    数据库的acid
    String StringBuffer和StringBuilder
  • 原文地址:https://www.cnblogs.com/acgoto/p/8987134.html
Copyright © 2011-2022 走看看