一、题目
二、思路分析
这道动态规划题目有点类似于背包问题,可以把题目理解为有一个背包体积为m,这个时候有n种货物,且每种货物都给定了最大数量,请问总共有多少种装法。于是声明一个二维数组dp[n][m],表示从第i种货物挑选不超过背包剩余体积的总方案数。
三、代码
#include <bits/stdc++.h>
using namespace std;
const long long MOD=1e6+7;
const int N=105;
int dp[N][N];
int n,m;
int a[N];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
dp[0][0]=1;
for(int i=1;i<=n;i++){
for(int j=0;j<=m;j++){
int t=min(a[i],j);
for(int k=0;k<=t;k++){
dp[i][j]=(dp[i][j]+dp[i-1][j-k])%MOD;
}
}
}
cout<<dp[n][m];
return 0;
}