华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2002|回复: 6
打印 上一主题 下一主题

P1077 摆花

[复制链接]

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
跳转到指定楼层
楼主
发表于 2018-6-3 22:39:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
https://www.luogu.org/problemnew/show/P1077

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

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

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

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

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

输入输出样例
输入样例#1:
2 4
3 2
输出样例#1:
2
NOIP 2012 普及组 第三题

回复

使用道具 举报

0

主题

5

帖子

43

积分

新手上路

Rank: 1

积分
43
沙发
发表于 2018-7-7 08:56:48 | 只看该作者
/// 取 mod 1000007的值
#include<iostream>
#include<cstring>
using namespace std;
int n,m;
int a[101];
int pp[101][101];
int baih(int mm,int f)
{
    int ans=0;
    if(mm<0)
        return 0;
    if(mm==0)
        return 1;
    if(f>n)
        return 0;
        if(pp[mm][f]!=-1)
            return pp[mm][f];
    for(int i=0;i<=a[f];i++)
    {
        ans+=baih(mm-i,f+1);
        ans%=1000007;
    }
    pp[mm][f]=ans;
    return ans;
}
int main()
{
    cin>>n>>m;
    memset(pp,-1,sizeof(pp));
    for(int i=1;i<=n;i++)
        cin>>a[i];
    cout<<baih(m,1);
    return 0;
}
回复 支持 反对

使用道具 举报

9

主题

89

帖子

292

积分

华一学生

积分
292
板凳
发表于 2018-7-27 19:35:52 | 只看该作者
  1. #include<iostream>
  2. using namespace std;
  3. int n,m,a[110],i,j,k;
  4. int dp[110][110];
  5. int mod=1000007;
  6. int main()
  7. {
  8.         cin>>n>>m;
  9.         for (i=1;i<=n;i++) cin>>a[i];
  10.         for (i=0;i<=m;i++) dp[i][0]=1;
  11.        
  12.         for (i=1;i<=n;i++)///i表示第几种花
  13.             for (j=1;j<=m;j++)///j表示第i种花有多少盆
  14.                for (k=j;k>=j-a[i] && k>=0;k--)
  15.                {
  16.                            dp[i][j]+=dp[i-1][k]%mod;
  17.                            dp[i][j]%=mod;
  18.                    }
  19.         cout<<dp[n][m];
  20.         return 0;
  21. }
复制代码
回复 支持 反对

使用道具 举报

0

主题

31

帖子

94

积分

注册会员

Rank: 2

积分
94
地板
发表于 2018-7-27 20:05:31 | 只看该作者
  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. const int MOD=1000007;
  5. int n,m;
  6. int f[1001][1001];
  7. int a[1001];
  8. int main()
  9. {
  10.         scanf("%d%d",&n,&m);
  11.         f[0][0]=1;
  12.         for(int i=1;i<=n;i++)
  13.         {
  14.                 scanf("%d",&a[i]);
  15.         }
  16.         for(int i=1;i<=n;i++)
  17.         {
  18.                 for(int j=0;j<=m;j++)
  19.                 {
  20.                         for(int k=0;k<=a[i];k++)
  21.                         {
  22.                                 if(j<k)
  23.                                 {
  24.                                         continue;
  25.                                 }
  26.                                 f[i][j]+=f[i-1][j-k];
  27.                                 f[i][j]%=MOD;
  28.                         }
  29.                 }
  30.         }
  31.         int maxn=0;
  32.         for(int i=0;i<=n;i++)
  33.         {
  34.                 for(int j=0;j<=m;j++)
  35.                 {
  36.                         maxn=max(maxn,f[i][j]);
  37.                 }
  38.         }
  39.         printf("%d",f[n][m]);
  40.         return 0;
  41. }
复制代码
回复 支持 反对

使用道具 举报

50

主题

215

帖子

619

积分

高级会员

Rank: 4

积分
619
5#
发表于 2018-7-28 10:02:59 | 只看该作者
  1. #include<iostream>
  2. using namespace std;
  3. int n,m,a[110],f[110][110];
  4. int i,j,k;
  5. int main()
  6. {
  7.     cin>>n>>m;
  8.     for(i=1;i<=n;i++)
  9.     cin>>a[i];
  10.     f[0][0]=1;
  11.     for(i=1;i<=n;i++)
  12.         {
  13.                 for(j=0;j<=m;j++)
  14.                 {
  15.                         for(k=0;k<=a[i];k++)
  16.                         {
  17.                                 if(k>j)break;
  18.                             f[i][j]=(f[i-1][j-k]+f[i][j])%1000007;
  19.                     }
  20.                 }
  21.          }
  22.     cout<<f[n][m]<<endl;
  23.     return 0;
  24. }
复制代码
回复 支持 反对

使用道具 举报

2

主题

105

帖子

306

积分

中级会员

Rank: 3Rank: 3

积分
306
6#
发表于 2018-7-29 19:41:10 | 只看该作者
  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <iostream>
  4. #include <cmath>
  5. #include <cstring>
  6. #include <set>
  7. using namespace std;
  8. int a[150]={0},f[150][150]={0};
  9. int main()
  10. {
  11.         int n,m;
  12.         scanf("%d%d",&n,&m);
  13.         for(int i=1;i<=n;i++)
  14.                 scanf("%d",&a[i]);
  15.         f[0][0]=1;
  16.         for(int i=1;i<=n;i++)
  17.                 for(int j=0;j<=m;j++)
  18.                         for(int k=0;k<=j&&k<=a[i];k++)
  19.                                 f[i][j]=(f[i][j]+f[i-1][j-k])%1000007;
  20.         printf("%d",f[n][m]);
  21.     return 0;
  22. }
复制代码
回复 支持 反对

使用道具 举报

9

主题

26

帖子

111

积分

禁止发言

积分
111
7#
发表于 2018-8-3 21:51:06 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-12-25 13:28 , Processed in 0.358784 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表