题目大意:
小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆。通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号。为了在门口展出更多种花,规定第i种花不能超过ai盆,摆花时同一种花放在一起,且不同种类的花需按标号的从小到大的顺序依次摆列。
试编程计算,一共有多少种不同的摆花方案。
题解:dp
f[i][j]表示前i种花的最后一盆摆放在j这个位置的方案数。
可以一盆也不放。
#include<iostream>
#include<cstdio>
#include<cstring>
#define p 1000007
#define LL long long
using namespace std;
LL a[110],f[200][110],n,m;
int main()
{
int i,j,k,x,num=0;
scanf("%lld%lld",&n,&m);
for (i=1;i<=n;i++) scanf("%lld",&a[i]);
for(i=0;i<=a[1];i++)
f[1][i]=1;
for (j=0;j<=m;j++)
for (i=2;i<=n;i++)
{
f[i][j]=f[i-1][j];
for (k=1;k<=a[i];k++)
if (j-k>=0)
f[i][j]+=f[i-1][j-k]%p;
}
printf("%lld",f[n][m]%p);
return 0;
}