花的摆放是按顺序且同种在一块,这可以递推。设dp[i][j]表示前i种花总共摆放j个的方案数。遍历第i种花可能的摆放个数k,有递推公式:dp[i][j]+=dp[i-1][j-k]。唯一的坑点是这个j要从0开始。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int n,m;
int arr[105];
long long dp[105][105];
int main()
{cin>>n>>m;int mod=1e6+7;dp[0][0]=1;for(int i=1;i<=n;i++){cin>>arr[i];}for(int i=1;i<=n;i++){for(int j=0;j<=m;j++){for(int k=0;k<=min(j,arr[i]);k++){dp[i][j]+=dp[i-1][j-k];dp[i][j]%=mod;}}}cout<<dp[n][m];return 0;
}