其他分享
首页 > 其他分享> > P1077 摆花 dp

P1077 摆花 dp

作者:互联网

  

题目描述

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

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

输入输出格式

输入格式:

 

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

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

 

输出格式:

 

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

 

输入输出样例

输入样例#1: 复制
2 4
3 2
输出样例#1: 复制
2


经典dp
1:
#include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define pb push_back
#define REP(i,N)  for(int i=0;i<(N);i++)
#define CLR(A,v)  memset(A,v,sizeof A)
//////////////////////////////////
#define inf 0x3f3f3f3f
#define lson l,m,pos<<1
#define rson m+1,r,pos<<1|1
const int N=4000+5;
const int mod=1000007;
int dp[N][N];

int main()
{
    int n,m;RII(n,m);

    rep(i,0,n)
    dp[i][0]=1;

    rep(i,1,n)
    {
        int x;RI(x);
        rep(j,0,x)//枚举该种类花的数量
        rep(k,0,m-j)//继承前面花的数量
        if(j||k)//显然  不能同时为0  不然会重复
        dp[i][j+k]=(dp[i][j+k]+dp[i-1][k])%mod;
    }

    cout<<dp[n][m]%1000007;

    return 0;
}
View Code

2:

#include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define pb push_back
#define REP(i,N)  for(int i=0;i<(N);i++)
#define CLR(A,v)  memset(A,v,sizeof A)
//////////////////////////////////
#define inf 0x3f3f3f3f
#define lson l,m,pos<<1
#define rson m+1,r,pos<<1|1
const int N=4000+5;
const int mod=1000007;
int dp[N][N];

int main()
{
    int n,m;RII(n,m);

    rep(i,0,n)
    dp[i][0]=1;

    rep(i,1,n)
    {
        int x;RI(x);
        rep(j,1,m)
        rep(k,0,x)
        if(j-k>=0)
        dp[i][j]=(dp[i][j]+dp[i-1][j-k] )%mod;
    }

    cout<<dp[n][m]%1000007;

    return 0;
}
View Code

 




标签:摆花,int,scanf,d%,long,P1077,dp,define
来源: https://www.cnblogs.com/bxd123/p/10856164.html