用一个数组 f [ i ] 表示 只有 i 个盆时的摆花种类
AC代码
#include<bits/stdc++.h>
using namespace std;
int s[200];//花数
int f[200];//种类
int mod=1000007;
int main()
{
int n,m;
cin>>n>>m;
for(int i=1; i<=n; i++)
cin>>s[i];
f[0]=1;
for(int i=1; i<=n; i++)
for(int j=m; j>=0; j--)
for(int k=1; k<=min(s[i],j); k++)
f[j]=(f[j]+f[j-k])%mod;//状态转移
cout<<f[m];
return 0;
}
下面具体分析状态转移如何实现
首先要对数组初始化,显然花盆数为0时,只有一种,f[0]=1
k 为第几个数拿出几个花,j 就为当前花盆数
我举一组数据方便演示
3 6
5 4 3
首先从第一个数 5 开始
f[i]的具体值如下
1 1 1 1 1 1 0
除了花盆数为6不够外,其余都为1
然后是第二个数 4
当 j = 6 ,k=1,
f[6]=f[6]+f[5]
以此类推得到
1 2 3 4 5 5 4
同理第三个数 3
1 3 6 10 14 17 18
得到答案