题目:
题解:
dp[i][j]表示在前i中花里选择了j盆的方案数;
由dp[i-1][j-k]递推累加而来,其中0<=k<=a[i],k为枚举第i种花选了多少盆;
看到网上有题解说是多重背包的方案数,,不是很懂。。。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int p=1000007;
int m,n,a[300];
long long dp[305][300];
int main(){
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++) scanf("%d",&a[i]);
for(int i=0;i<=a[1];i++) dp[1][i]=1;
for(int i=1;i<=m;i++) dp[i][0]=1;
for(int i=2;i<=m;i++)
for(int j=1;j<=n;j++)
for(int k=0;k<=a[i];k++)
dp[i][j]=(dp[i][j]%p+dp[i-1][j-k]%p)%p;
printf("%d",dp[m][n]);
}