先从二维的背包开始考虑
状态表示: f [ i ] [ j ] 前 i 种花里面选 j 盆 有几种选法 用 k 表示第i种花选几盆
状态计算: 遍历k f [ i ] [ j ] += f [ i - 1 ] [ j - k ]
然后优化成一维 还是比较好想的 这里 j - k 是比 j 要小的 所以第二层 j 的循环要从后往前遍历
f [ j ] += f [ j - k ]
保险起见,每加一次就取模一次
#include <bits/stdc++.h>
using namespace std;
int dp[105],a[105];
int n,m;
int main()
{
cin>>n>>m;
dp[0]=1;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)
{
for(int j=m;j>=0;j--)
{
for(int k=1;k<=j&&k<=a[i];k++)
dp[j]=(dp[j]+dp[j-k])%1000007;
}
}
cout<<dp[m]<<endl;
return 0;
}