多重背包例题

简介: 多重背包例题

多重背包


LeetCode上无对应题目,只简单介绍


1. 多重背包例题

题目

有N种物品和一个容量为 V 的背包。第i种物品最多有 M i 件可用,每件耗费的空间是 C i

,价值是 W i 。求解将哪些物品装入背包可使这些物品的耗费的空间 总和不超过背包容量,且价值总和最大。


多重背包和01背包是非常像的, 为什么和01背包像呢?


每件物品最多有 M i 件可用,把 M i 件摊开,其实就是一个01背包问题了。


例如:


背包最大重量为10。


物品为:


重量 价值 数量
物品0

1

15

2

物品1

3

20

3

物品2

4

30

2

问背包能背的物品最大价值是多少?


和如下情况有区别么?


重量 价值 数量
物品0

1

15

1

物品0

1

15

1

物品1

3

20

1

物品1

3

20

1

物品1

3

20

1

物品2

4

30

1

物品2

4

30

1

毫无区别,这就转成了一个01背包问题了,且每个物品只用一次。


思路

将有多件的物品展开,就可将完全背包转换成01背包


代码展示

#include <iostream>
#include <vector>
using namespace std;
void test_multi_pack()
{
    vector<int> weight = {1, 3, 4};
    vector<int> value = {15, 20, 30};
    vector<int> nums = {2, 3, 2};
    int bagWeight = 10;
    for (int i = 0; i < nums.size(); i++)
    {
        while (nums[i] > 1)
        { // nums[i]保留到1,把其他物品都展开
            weight.push_back(weight[i]);
            value.push_back(value[i]);
            nums[i]--;
        }
    }
    vector<int> dp(bagWeight + 1, 0);
    for (int i = 0; i < weight.size(); i++)
    { // 遍历物品
        for (int j = bagWeight; j >= weight[i]; j--)
        { // 遍历背包容量
            dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
        }
        for (int j = 0; j <= bagWeight; j++)
        {
            cout << dp[j] << " ";
        }
        cout << endl;
    }
    cout << dp[bagWeight] << endl;
}
int main()
{
    test_multi_pack();
    return 0;
}
目录
相关文章
|
前端开发 JavaScript
React项目路由懒加载lazy、Suspense,使第一次打开项目页面变快
本文介绍了在React项目中实现路由懒加载的方法,使用React提供的`lazy`和`Suspense`来优化项目首次加载的速度。通过将路由组件改为懒加载的方式,可以显著减少初始包的大小,从而加快首次加载速度。文章还展示了如何使用`Suspense`组件包裹`Switch`来实现懒加载过程中的fallback效果,并提供了使用前后的加载时间对比,说明了懒加载对性能的提升作用。
751 2
React项目路由懒加载lazy、Suspense,使第一次打开项目页面变快
|
11月前
|
Java 编译器
java“变量 x 可能未被初始化”解决
在Java中,如果编译器检测到变量可能在使用前未被初始化,会报“变量 x 可能未被初始化”的错误。解决方法包括:1. 在声明变量时直接初始化;2. 确保所有可能的执行路径都能对变量进行初始化。
863 2
|
Oracle 关系型数据库 MySQL
Navicat Premium 16 简体中文 (含激活工具)
Navicat premium是一款好用的数据库管理工具。将此工具连接数据库,你可以从中看到各种数据库的详细信息。
875 0
Navicat Premium 16 简体中文 (含激活工具)
解决:java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file
解决:java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file
|
机器学习/深度学习 算法 数据挖掘
【Python机器学习】K-Means算法对人脸图像进行聚类实战(附源码和数据集)
【Python机器学习】K-Means算法对人脸图像进行聚类实战(附源码和数据集)
684 1
|
资源调度 JavaScript 前端开发
【源码共读】Vite 项目自动添加 eslint 和 prettier
【源码共读】Vite 项目自动添加 eslint 和 prettier
516 0
StringUtils.isBlank() 报红!
StringUtils.isBlank() 报红!
184 0
|
负载均衡 监控 Dubbo
读书分享:《Apache Dubbo 微服务开发从入门到精通》
本次分享的书是《Apache Dubbo 微服务开发从入门到精通》,该书以 Dubbo 框架为例,全面讲解微服务从开发、配置、部署到治理、流量管控、可视化监测、事务管理全生命周期过程;涵盖 Dubbo3 最新特性使用方式与原理,包括云原生 Kubernetes、Service Mesh 解决方案等。通过阅读书籍,计划通过以下几个问题来带你们深入了解Dubbo的神奇之处。
读书分享:《Apache Dubbo 微服务开发从入门到精通》
|
弹性计算 负载均衡 安全
阿里云SLB简介和购买流程
阿里云SLB是阿里巴巴集团旗下的一个功能强大且高性能的负载均衡服务。在互联网的快速发展和技术创新的推动下,SLB成为了保证网站和应用程序可靠性、可扩展性和高可用性的重要组成部分之一。通过阿里云SLB,用户可以轻松地将流量分发到多个服务器,从而提高系统的整体性能和应用的可用性。这样每台服务器承受的压力都会减小很多