1 条题解
-
0
一道新学dp的同学可以做的题目。
注意到每一次摆花都会用到之前摆的花的方案数,可以确定这是一道动态规划的题目。
建立dp数组,用i种花可以摆j盆,得到数组dp[i][j],每一次摆花时,用一种新花可以有多种不同的总盆数,所以采用累加确定每一个点的方案数。
套用模版: 1 初始化:dp[0][0]=1;不用花摆0盆一共有一种。 2 递推:对于每一个点,假设当前的新花要摆k盆,则递推公式为dp[i][j]=dp[i-1][j-k] 3 输出:输出dp[n][m]
以及记得每次取模,相加total的值。
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int n,m;cin>>n>>m; vector<int> a(n); for(int i=0;i<n;i++){ cin>>a[i]; } vector<vector<int>> dp(n+1,vector<int>(m+1)); dp[0][0]=1; for(int i=1;i<=n;i++){ int max=a[i-1]; int zong; for(int j=0;j<=m;j++){ zong=0; for(int k=0;k<=max&&k<=j;k++){ zong+=dp[i-1][j-k]; } zong%=1000007; dp[i][j]=zong; } } printf("%d",dp[n][m]%1000007); return 0; }
- 1
信息
- ID
- 394
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 319
- 已通过
- 200
- 上传者