问题描述:
解题思路:
多重背包加强版,不能使用基础模板一个个分组,时间会超时,因此需要使用二进制进行优化分组。O(n*long(s)*v)
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 2e4 + 9;
int dp[N];
// 多重背包优化模板(二进制优化,减小时间复杂度)
int main()
{
int n, m;cin >> n >> m;
for(int i = 1; i <= n; i++)
{
int v, w, s;cin >> v >> w >> s;
// s = 14
for(int k = 1; k <= s; s -= k, k += k) // k = 1 2 4....8
{
for(int j = m; j >= k*v; j--)dp[j] = max(dp[j], dp[j - k*v] + k*w); // 记得k*w和k*v
}
// s = 6,剩余的背包数,当作一组计算
for(int j = m; j >= s*v; j--)dp[j] = max(dp[j], dp[j - s*v] + s*w);
}
cout << dp[m] << '\n';
return 0;
}
知识点:优化多重背包