题目链接:点击这里
不会,思路:https://www.acwing.com/solution/acwing/content/5163/
时间复杂度 ,AC代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 20010;
int dp[N], pre[N], q[N];
int n, m;
int main()
{
cin >> n >> m; //物品种数和背包容积
for (int i = 0; i < n; ++i)
{
memcpy(pre, dp, sizeof(dp));
int v, w, s; //物品的体积、价值和数量
cin >> v >> w >> s;
for (int j = 0; j < v; ++j) //枚举余数0~v-1
{
int head = 0, tail = -1;
for (int k = j; k <= m; k += v)
{
if (head <= tail && k - s * v > q[head])
++head;
if (head <= tail)
dp[k] = max(dp[k], pre[q[head]] + (k - q[head]) / v * w);
while (head <= tail && pre[q[tail]] - (q[tail] - j) / v * w <= pre[k] - (k - j) / v * w)
--tail;
q[++tail] = k;
}
}
}
cout << dp[m] << endl;
return 0;
}