明显的dp。。
dp[i]表示摆i盆花的方案数。
容易得到:dp[i]=(dp[i-1]+dp[i-2]+...+dp[i-a[j]])%mod
边界条件:dp[0]=1.
但是要注意在求和时判断数组下标的下限。
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int mod = 1000007; 4 int n, m, a[105], dp[105]; 5 int main() { 6 scanf("%d%d", &n, &m); 7 for(int i = 1; i <= n; i++) scanf("%d", &a[i]); 8 dp[0] = 1; //边界条件 9 for(int i = 1; i <= n; i++) //枚举每一种花 10 for(int j = m; j >= 1; j--) //枚举每一个摆花的结束点 11 for(int k = 1; k <= a[i] && j - k >= 0; k++) //枚举摆花的盆数 12 dp[j] = (dp[j - k] + dp[j]) % mod; //求和 13 printf("%d\n", dp[m]); //输出 14 return 0; 15 }