题目如下
数据范围
本题是混合背包问题,但是我们可以把两个限定数量的硬币放到后面什么意思呢?
1 2 6是随便用的我们可以利用上楼梯的思想先把不用4的数量算出来随后把4和8即1个4和2个4当做0/1背包来做。
通过代码
cpp
class Solution {
public:
int numberOfWays(int n) {
vector<int> dp(n + 1, 0);
vector<int> co = {1, 2, 6};
int mod = 1e9 + 7;
dp[0] = 1;
for (int i = 0; i < 3; i++) {
for (int j = 1; j <= n; j++) {
if(j >= co[i])
dp[j] = (dp[j] + dp[j - co[i]]) % mod;
}
}
int ans = dp[n];
if(n >= 4)ans = (ans + dp[n - 4]) % mod;
if(n >= 8)ans = (ans + dp[n - 8]) % mod;
return ans;
}
};
