动态规划
定义f[i][j]表示前i种花摆满j个花盆所得的方案数
f[i][j] = f[i][j] + f[i-1][j-min(a[i],j)
代码如下
#include<iostream>
#include<cstdio>
#include<cctype>
using namespace std;
#define in = read()
typedef long long ll;
const ll size = 500 + 10;
ll n,m;
ll a[size];
ll f[size][size];
inline ll read(){
ll num = 0 , f = 1; char ch = getchar();
while(!isdigit(ch)){
if(ch == '-') f = -1;
ch = getchar();
}
while(isdigit(ch)){
num = num*10 + ch - '0';
ch = getchar();
}
return num*f;
}
int main(){
n in; m in;
for(int i=1;i<=n;i++)
a[i] in;
f[0][0] = 1;
for(int i=1;i<=n;i++)
for(ll j=0;j<=m;j++)
for(int k=0;k<=min(a[i],j);k++)
f[i][j] = (f[i][j] + f[i - 1][j - k]) % 1000007;
printf("%d",f[n][m] % 1000007);
}
//COYG