• 洛谷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;
    }
    
  • 相关阅读:
    内存溢出异常
    Java堆中的对象
    运行时数据区域
    字符串常量池
    自己编译JDK
    @PathVariable注解详解
    spring容器监听器
    redis和spring整合
    Redis安装、启动、关闭
    HDU3974 Assign the task
  • 原文地址:https://www.cnblogs.com/quanjun/p/11929626.html
Copyright © 2020-2023  润新知