zoukankan      html  css  js  c++  java
  • [NOIP2012] 摆花

    1270. [NOIP2012] 摆花

    http://cogs.pro/cogs/problem/problem.php?pid=1270

    ★   输入文件:flower.in   输出文件:flower.out   简单对比
    时间限制:1 s   内存限制:128 MB

    【题目描述】

    小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆。通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号。为了在门口展出更多种花,规定第i 种花不能超过ai 盆,摆花时同一种花放在一起,且不同种类的花需按标号的从小到大的顺序依次摆列。

    试编程计算,一共有多少种不同的摆花方案。

    【输入格式】

    输入文件flower.in,共2行。

    第一行包含两个正整数n和m,中间用一个空格隔开。

    第二行有n个整数,每两个整数之间用一个空格隔开,依次表示a1、a2、……an。

    【输出格式】

    输出文件名为flower.out。

    输出只有一行,一个整数,表示有多少种方案。注意:因为方案数可能很多,请输出方案数对1000007取模的结果。

    【输入输出样例】

    flower.in flower.out
    2 4
    3 2
    2

    【输入输出样例说明】

    有2种摆花的方案,分别是(1,1,1,2),  (1,1,2,2)。括号里的1和2表示两种花,比如第一个方案是前三个位置摆第一种花,第四个位置摆第二种花。

    【数据规模】

    对于20%数据, 有0<n≤8,0<m≤8,0≤ai≤8;

    对于50%数据, 有0<n≤20,0<m≤20,0≤ai≤20;

    对于100%数据,有0<n≤100,0<m≤100,0≤ai≤100。

    用f[i][j]表示前i种花一共种了m盆的方案数,则f[i][j]=sum{f[i-1][j-k]}   (0<=k<=a[i])

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int n,m,a[110],f[110][110];
    int main(){
        freopen("flower.in","r",stdin);
        freopen("flower.out","w",stdout);
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        for(int i=0;i<=a[1];i++)f[1][i]=1;
        for(int i=2;i<=n;i++)
            for(int j=0;j<=m;j++)
                for(int k=0;k<=a[i];k++)
                    if(j>=k)f[i][j]=(f[i][j]+f[i-1][j-k])%1000007;
        printf("%d",f[n][m]);
    }
  • 相关阅读:
    78. Subsets
    93. Restore IP Addresses
    71. Simplify Path
    82. Remove Duplicates from Sorted List II
    95. Unique Binary Search Trees II
    96. Unique Binary Search Trees
    312. Burst Balloons
    程序员社交平台
    APP Store开发指南
    iOS框架搭建(MVC,自定义TabBar)--微博搭建为例
  • 原文地址:https://www.cnblogs.com/thmyl/p/6818679.html
Copyright © 2011-2022 走看看