力扣周赛第4题:获得分数的方法数
模板思路:
设 dp[i][j] 为使用前 i 种题目总共能够得到 j 分的方法数,则题目要求的答案即为 dp[n][target] (使用n种题目能够正好得到target分数的方案数)
对于 dp[i+1][j] 来说,当使用前 i 种题目时,增加的方案数应该与 dp[i][j-marks(i)xk] ,(0<=k<=count(i)) 有关
初始值及边界值确认
对于dp[0][0] 来说,使用前0种题目得到0分的方案数为1,也就是什么都不做,对于dp[i][j-marks(i)xk] 来说,需要保证 j-marks(i)xk>=0 ,否则会发生越界
模板dp代码
class Solution {
public:
const int MOD = 1e9+7;
int waysToReachTarget(int target, vector<vector<int>>& types) {
int n=types.size();
vector<vector<int>> dp(n+1,vector<int>(target+1,0));//数组扩充1位,便于遍历并返回dp[n][target]
dp[0][0]=1;//初始化
for(int i=0;i<n;++i){
int count=types[i][0];//count(i)
int marks=types[i][1];//marks(i)
for(int j=0;j<target+1;++j){
for(int k=0;k<count+1&&marks*k<=j;++k){
dp[i+1][j]+=dp[i][j-marks*k];
dp[i+1][j]%=MOD;
}
}
}
return dp[n][target]%MOD;
}
};