一道01背包变形题,用闫氏dp搞一下子集划分
/*#include<iostream>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
ll lose[N], win[N], use[N], f[N];
int n, m;
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)cin >> lose[i] >> win[i] >> use[i];
for (int i = 1; i <= n; i++)
{
for (int j = m; j >= 0; j--)
{
if (j >= use[i])//如果有资格认输
{
f[j] = max(f[j] + lose[i], f[j-use[i]] + win[i]);
}
else f[j] += lose[i];
}
}
cout << f[m]*5;
return 0;
}*/
#include<iostream>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
ll lose[N], win[N], use[N], f[N];
ll n, m;
int main()
{
cin >> n >> m;
ll res = 0;
/*做预处理
1.先把lose的价值全部加到答案里
2.把每次赢的价值改为win[i]-lose[i]
这样就变成了01背包
*/
for (int i = 1; i <= n; i++)
{
cin >> lose[i] >> win[i] >> use[i];
res += lose[i];
win[i] -= lose[i];
}
for (int i = 1; i <= n; i++)
{
for (int j = m; j >= use[i]; j--)
{
f[j] = max(f[j], f[j - use[i]] + win[i]);
}
}
res += f[m];
res *= 5;
cout << res;
return 0;
}