zoukankan      html  css  js  c++  java
  • hdoj1521

    Problem : 1521 ( 排列组合 )     Judge Status : Accepted
    RunId : 2856508    Language : G++    Author : huwenbiao
    Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta
    /***************************************************************\
    *Author:Hu Wenbiao
    *Created Time: Sun 22 Aug 2010 09:47:05 AM CST
    *File Name: main.cpp
    *Description:组合问题。母函数,其实已经没有了母函数的样子,倒像是一个递推
    \***************************************************************/

    //*========================*Head File*========================*\\

    #include<iostream>
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    /*----------------------*Global Variable*----------------------*/
    int
    m,n,A[
    12],B[12],C[12];
    //*=======================*Main Program*=======================*//
    using namespace std;

    int
    main(){

    //freopen("input","r",stdin);
    while(scanf("%d%d",&n,&m)!=EOF){
    for
    (int i=
    1;i<=n;i++){
    scanf(
    "%d",A+i);//物品个数
    }
    memset(B,
    0,sizeof(B));
    memset(C,
    0,sizeof(C));
    for
    (int i=
    1;i<=n;i++){//第i件物品
    for(int j=0;j<=m;j++){//总个数,指数
    if(j!=0&&B[j]==0)//当B[j]是0时,表示没这种排列,于是便不能
    //在此基础上再往下构建新排列了,当然j==0时是初始状态,应当放行。
    continue;
    for
    (int k=
    1;k<=A[i]&&j+k<=m;k++){//添加的物品个数,(也可以从0开始,下面是赋值)
    int method=1;//能构建的排列数
    for(int s=1;s<=k;s++){
    method*=(j+s);
    method/=s;
    }

    if
    (j)
    C[j+k]+=method*B[j];
    //每一种能构建method种,共有method*B[j]
    else//j==0时是特例
    C[j+k]+=method;
    }
    }

    for
    (int j=
    0;j<=m;j++){
    B[j]+=C[j];
    //此处不是赋值,要加上去(如果上面从0开始,这里就是赋值)
    C[j]=0;
    }
    }

    printf(
    "%d\n",B[m]);
    }
    }
  • 相关阅读:
    UVA Live Achrive 4327 Parade (单调队列,dp)
    从磁盘读取一个文件到内存中,再打印到控制台
    二分查找法
    日期:Date
    线程与进程
    泛型基本知识
    泛型
    Map集合的遍历方式:
    Arrays
    Set接口
  • 原文地址:https://www.cnblogs.com/Open_Source/p/1904883.html
Copyright © 2011-2022 走看看