#include<iostream>
#include<vector>
using namespace std;
const int N = 1010,M=2010;
int n, m, dp[N], v[N], w[N], s[N];
vector<pair<int, int>>goods;
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
cin >> v[i] >> w[i] >> s[i];
int t = s[i];
for (int j = 1; j <= t ; j *= 2)
{
goods.push_back({ j * v[i],j * w[i] });
t -= j;
}
if(t>0)goods.push_back({ t * v[i],t* w[i] });
}
for (auto good : goods)
{
int vv = good.first, ww = good.second;
for (int i = m; i >= ww; i--)
{
dp[i] = max(dp[i], dp[i - ww] + vv);
}
}
cout << dp[m];
return 0;
}
算法.多重背包(二进制优化)
最新推荐文章于 2024-09-12 19:02:20 发布