AcWing 5. 多重背包问题 II 看一遍忘不了
原题链接
中等
作者:
AC_any
,
2021-04-09 22:43:37
,
所有人可见
,
阅读 278
一遍记住
- 多重背包就是 0s背包,可以转化成logs个01背包 —— y总 算法基础课
故事级别注释
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 12010, M = 2010;
int n, m;
int v[N];//美女的价位
int w[N];//养眼指数
int f[M];//土豪选老婆最大的养眼指数
int main()
{
cin >> n >> m;
int cnt = 0;//能最后参加土豪选老婆的选手个数
for (int i = 1; i <= n; i ++ )
{
int a, b, s;cin >> a >> b >> s;//第一组入场
//内部选出代表
int k = 1;
while (k <= s)
{
cnt ++ ; v[cnt] = a * k; w[cnt] = b * k;//带上k中选一的优势,进入下一轮
s -= k;//踢出选过的
k *= 2;//翻倍级别的淘汰率
}
if (s > 0)//剩下的直接选一个
{
cnt ++ ;
v[cnt] = a * s;
w[cnt] = b * s;
}
}
//01背包模板
n = cnt;
for (int i = 1; i <= n; i ++ )//第i个美女进来
for (int j = m; j >= v[i]; j -- )//从最有钱的大款问“姐美吗?”碰碰运气
f[j] = max(f[j], f[j - v[i]] + w[i]);//都是大款了,还挑挑拣拣?!
cout << f[m] << endl;
return 0;
}