AcWing 451. 摆花
原题链接
简单
//动态规划-二维-三重循环
#include<iostream>
using namespace std;
const int N=105,mod=1000007;
int n,m,a[N];
int dp[N][N];
//dp[i][j]:在前i个花中选择,并且选择花的数量为j的方案数
//性质:cnt
//状态计算:
//不选:dp[i][j]=dp[i-1][j]
//选(1,2,3,k...):dp[i][j]+=dp[i-1][j-k]
void input(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
}
int main(){
input();
dp[0][0]=1;
for(int i=1;i<=n;i++){
for(int j=0;j<=m;j++){
for(int k=0;k<=j&&k<=a[i];k++){
dp[i][j]+=dp[i-1][j-k];
dp[i][j]%=mod;
}
}
}
cout<<dp[n][m]<<endl;
return 0;
}
//动态规划-一维-三重循环
#include<iostream>
using namespace std;
const int N=105,mod=1000007;
int n,m,a[N];
int dp[N];
//dp[j]:在前n个花中选择,并且选择花的数量为j的方案数
//性质:cnt
//状态计算:
//不选:dp[j]=dp[j]
//选(1,2,3,k...):dp[j]+=dp[j-k]
void input(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
}
int main(){
input();
dp[0]=1;
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-k];
dp[j]%=mod;
}
}
}
cout<<dp[m]<<endl;
return 0;
}