洛谷 P1077 [NOIP2012 普及组] 摆花 (DP)
https://www.luogu.com.cn/problem/P1077
题目描述
摆上m盆花。
一共有n种花,从1到n标号。为了在门口展出更多种花,规定第i种花不能超过ai盆,摆花时同一种花放在一起,且不同种类的花需按标号的从小到大的顺序依次摆列。
试编程计算,一共有多少种不同的摆花方案。
注意:因为方案数可能很多,请输出方案数对10^6+7取模的结果。
输入 #1
2 4
3 2
输出 #1
2
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL N=500200,M=2002;
const LL mod=1e6+7;
LL a[N],f[M][M];
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
LL T=1;
//cin>>T;
while(T--)
{
LL n,m;
cin>>n>>m;
for(LL i=1;i<=n;i++)
{
cin>>a[i];//每种花的可以摆放的最大数量
}
f[0][0]=1;
for(LL i=1;i<=n;i++)//每一种花
{
for(LL j=0;j<=m;j++)//总数量的安排
{
for(LL k=0;k<=min(j,a[i]);k++)//当前每一种花可以摆放的数量必须在自己的限制以及剩余地方的数量的限制下
{
//前一种花的数量下实现递增
f[i][j]=(f[i][j]+f[i-1][j-k])%mod;
}
}
}
cout<<f[n][m]<<endl;
}
return 0;
}