问题描述:
解题思路:
优化后的01背包拓展。
dp[i][j]表示体积是i且使用了j次魔法的情况下的价值。 两种转移情况:
1. dp[j][0] = max(dp[j][0],dp[j - w][0] + v);
2. dp[j][1] = max(dp[j][1],dp[j - w][1] + v,dp[j][1], dp[j - w - k][0] + 2 * v);
题解:
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e4 + 9;
ll dp[N][2];
int main()
{
int n, m, k;cin >> n >> m >> k;
for(int i = 1; i <= n; i++)
{
int w, v;cin >> w >> v;
for(int j = m; j >= 0; j--)
{
if(j >= w)
{
dp[j][0] = max(dp[j][0], dp[j - w][0] + v);
dp[j][1] = max(dp[j][1], dp[j - w][1] + v);
}
if(j >= w +k)
{
dp[j][1] = max(dp[j][1], dp[j - w - k][0] + 2 * v);
}
}
}
cout << max(dp[m][0], dp[m][1]) << '\n';
return 0;
}
知识点:01背包,动态规划