动态规划:多重背包问题

简介: 动态规划:多重背包问题

N种物品和一个容量是 V背包

i种物品最多有 si 件,每件体积是 vi,价值是 wi

求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。

输出最大价值。


输入格式

第一行两个整数,NV,用空格隔开,分别表示物品种数和背包容积。

接下来有 N 行,每行三个整数 vi,wi,si,用空格隔开,分别表示第 i 种物品的体积、价值和数量。


输出格式

输出一个整数,表示最大价值。

数据范围

0<N,V≤100

0<vi,wi,si≤100

暴力解法:

#include<iostream>
using namespace std;
const int N = 1010;
int n, m;
int v[N], w[N], s[N];
int dp[N][N];
int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        cin >> v[i] >> w[i] >> s[i];
    }
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            for (int k = 0; k <= s[i] && k * v[i] <= j; k++)
            {
                dp[i][j] = max(dp[i][j], dp[i - 1][j - v[i] * k] + w[i] * k);
            }
        }
    }
    cout << dp[n][m] << endl;
    return 0;
}

使用二进制优化:

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 25000; 
int n, m;
int v[N], w[N];    //重量  价值
int dp[N];
int main()
{
    cin >> n >> m;
    int cnt = 0;
    for (int i = 0; i <= n; i++)
    {
        int a, b, s;   //体积  价值  数量
        cin >> a >> b >> s;
        int k = 1;     //k的取值 1 2 4 8 16 32 64 128 ....(k<=s)
        while (k <= s)
        {
            cnt++;
            v[cnt] = a * k;;
            w[cnt] = b * 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++)
    {
        for (int j = m; j >= v[i]; j--)
        {
            dp[j] = max(dp[j], dp[j - v[i]] + w[i]);
        }
    }
    cout << dp[m] << endl;
    return 0;
}
目录
相关文章
|
10月前
|
Ubuntu 计算机视觉 C++
Ubuntu系统下编译OpenCV4.8源码
通过上述步骤,你可以在Ubuntu系统上成功编译并安装OpenCV 4.8。这种方法不仅使你能够定制OpenCV的功能,还可以优化性能以满足特定需求。确保按照每一步进行操作,以避免常见的编译问题。
303 43
|
Java Linux 程序员
记录:Unsatisfied dependency expressed through field 'XxxService'...【亲测有效】
记录:Unsatisfied dependency expressed through field 'XxxService'...【亲测有效】
1793 1
|
Java
深入理解Java中的instanceof运算符
深入理解Java中的instanceof运算符
647 0
|
存储 监控 安全
Star Tower:区块链创新的关键拼图与卓越优势
在当今科技浪潮中,Star Tower 作为区块链领域的新星,凭借智能计算节点、区块链网络、智能合约、客户端应用、网络通信协议和数据存储系统的卓越设计,实现了高效资源利用、数据安全、自动化执行、便捷交互、加密通信和高可用存储,展现出显著的技术优势,有望引领区块链技术迈向新高度。
297 12
|
SQL JavaScript 前端开发
vue中使用分页组件、将从数据库中查询出来的数据分页展示(前后端分离SpringBoot+Vue)
这篇文章详细介绍了如何在Vue.js中使用分页组件展示从数据库查询出来的数据,包括前端Vue页面的表格和分页组件代码,以及后端SpringBoot的控制层和SQL查询语句。
vue中使用分页组件、将从数据库中查询出来的数据分页展示(前后端分离SpringBoot+Vue)
|
数据采集 Web App开发 JavaScript
如何在Puppeteer中实现表单自动填写与提交:问卷调查
本文介绍了如何使用 Puppeteer 和代理 IP 技术实现在线问卷调查的自动填写与提交。Puppeteer 是一个基于 Node.js 的无头浏览器自动化库,能够模拟用户行为,填写表单并提交数据。通过配置代理 IP,可以提高匿名性和爬取效率,避免因频繁请求而被封禁。本文提供了详细的代码示例和技术分析,帮助读者理解和应用这一技术。
297 0
|
开发者
0-hackbar最新版本(2.3.1)工具安装(超详细)
0-hackbar最新版本(2.3.1)工具安装(超详细)
|
缓存 自然语言处理 Java
还在为字典值、枚举值校验烦恼吗,不妨试试这个
本文介绍了如何在Java中实现常量值校验的封装,主要包括两个方面:字典值类型的校验和枚举类型的校验。首先,作者提到在进行数据验证时,实体类字段需要添加`@Valid`注解。然后,对于字典值类型的校验,可以通过`@DictVaild`注解检查当前字段值是否在数据库中的字典值类别内,或者与预定义的枚举类中的值相匹配。在进行校验时,可以设置`dictType`参数为`DictType.CODE`或`DictType.LABEL`来分别验证代码值或标签值。
458 0
|
弹性计算 大数据 测试技术
阿里云服务器2核2G服务器多少钱?阿里云服务器2核2G服务器测评
阿里云服务器2核2G的价格根据配置和促销活动会有所不同。在2024年3月1日的降价政策之前,该服务器的价格可能为99元/年。然而,降价政策实施后,其价格可能会有所调整。具体的价格信息,建议前往阿里云官网查询。 关于阿里云服务器2核2G的测评,该服务器在性能上可以满足日常的网站搭建、应用开发等任务。它配备了2核CPU和2G内存,以及40G ESSD Entry云盘作为系统盘,可以保证服务器的稳定运行和高效性能。同时,服务器自带3M固定带宽,下载速度可达384KB/秒,且不限制流量,用户可以在使用过程中享受到稳定的网络连接速度。
|
数据采集 算法 计算机视觉
基于形态学处理和颜色模型的车辆跟踪和车辆颜色识别matlab仿真
基于形态学处理和颜色模型的车辆跟踪和车辆颜色识别matlab仿真