摆花

#include <bits/stdc++.h>
#define mod 1000007
using namespace std;
long long n,m,f[5000][5000],a[1010011];
int main(){
cin>>n>>m;
 for(int i=1;i<=n;i++) {
  cin>>a[i];
 }
 for(int i=0;i<=n;i++) f[i][0]=1;
 for(int i=1;i<=n;i++){
  for(int j=0;j<=m;j++){
   for(int k=0;k<=a[i];k++){//枚举可能摆的数量
    if(j==0&&k==0)
                    continue;
    if(j-k>=0)
    f[i][j]+=f[i-1][j-k];//i表示摆的第几种花,j表示摆的盆数
    //这一次的摆花的方案应该为上一次摆花的方案的累加和
  f[i][j]%=mod;
    //因为上一个不管是j-1,j-2,j......-k,都可以通过摆这k盆来得到(填空),很简单因为i种类的花可以摆k个
   }//将这些可能的到达目前状态的所有可能方案数累加就行了
  }
 }
 cout<<f[n][m];
return 0;
}

posted @ 2018-12-15 19:56  spytc  阅读(271)  评论(0编辑  收藏  举报