洛谷P1776 宝物筛选 题解 多重背包

题目链接:https://www.luogu.com.cn/problem/P1776
题目大意:
这道题目是一道 多重背包 的模板题。
首先告诉你 n 件物品和背包的容量 V ,然后分别告诉你 n 件物品的价值 w 、体积 c 以及数量 m ,求解这个背包能够装载的最大价值是多少?
解题思路:
直接套多重背包的模板解决这个问题。
注意这里的多重背包使用了二进制优化。
实现代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 100100;
int f[maxn], V, n, c, w, m;
void zero_one_pack(int c,int w) {   // 0-1背包
    for(int i = V; i >= c;i --) f[i] = max(f[i], f[i-c] + w);
}
void complete_pack(int val,int cost) {  // 完全背包
    for(int i = c; i <= V; i ++) f[i] = max(f[i], f[i-c] + w);
}
void multi_pack(int c,int w, int m) {   // 多重背包
    if(m * c >= V) complete_pack(c, w);
    else {
        int k = 1;
        while(k < m) {
            zero_one_pack(k*c, k*w);
            m -= k;
            k <<= 1;
        }
        zero_one_pack(m*c, m*w);
    }
}
int main() {
    cin >> n >> V;
    while (n --) {
        cin >> w >> c >> m;
        multi_pack(c, w, m);
    }
    cout << f[V] << endl;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/quanjun/p/11929626.html