动态规划DP之背包问题2---完全背包问题

news2024/12/25 9:35:30

目录

DP分析:

状态转移方程:

代码:

例子:


        与 01背包问题 不同点在于,每种物品可以使用无限次。

有 N 种物品和一个容量是 V 的背包,每种物品都有无限件可用。

第 i 种物品的体积是 vi,价值是 wi。

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

DP分析:

        解决此类问题,需要从状态表示以及状态计算进行分析。

        状态表示:问题的某种特定情况或属性。这些状态是问题的解的一部分,它们包含了问题的关键信息,可以帮助我们描述问题的结构,并且可以通过状态之间的转移来推导出最优解。可以再细分为集合(方案),描述变量表示的是什么,属性即要取的值是最大,最小或者其他。

        状态计算(状态转移):如下,通过 [1,i-1] 和  [0,j] 的状态计算 i 变量 和 j 变量的状态。

完全背包问题DP分析

         对状态计算其中的一些分析:

​​​​​​​

     那么,最终 f[i, j] 可以表示为:

        f[i, j] = max(f[i-1,j],\ f[i-1,j-v_i]+w_i,\ f[i-1,j-2*v_i]+2*w_i,\ ...)

        直到物品 i 的总体积小于 j       k*v_i \leqslant j 

     但是,可以发现,要对多个进行取max处理,需要多增加一层循环,时间复杂度可以达到O(n^3),会有超时的风险。

     解决:

       f[i, j] = max(f[i-1,j],\ f[i-1,j-v_i]+w_i,\ f[i-1,j-2*v_i]+2*w_i,\ ...) f[i, j-v_i] = max( f[i-1,j-v_i],\ f[i-1,j-2*v_i]+w_i,\ f[i-1,j-3*v_i]\\+2*w_i, ...)

        可以发现,f[i, j-v_i] + w_i 可以代替 f[i, j] 中除开 f[i-1,j] 后面的所有值操作。

        即 f[i, j-v_i]+w_i = f[i-1,j-v_i]+w_i,\ f[i-1,j-2*v_i]+2*w_i,\ ...

状态转移方程:

所以最终f[i, j] 的状态转移方程为: f[i,j]=max(f[i-1,j],\ f[i,j-v_i]+w_i) 

(很多人不理解该状态转移,理解过程如上DP分析所示,从最开始暴力解决开始分析,再依次优化,动态规划问题虽然代码看着简单,但是要理解其中原理和状态转移过程) 

        完全背包问题的状态转移方程看似和01背包问题的一样,但是其中转移过程却相隔十万八千里。动态规划DP之背包问题1---01背包问题-CSDN博客

代码:

        暴力 O(n^3)

for(int i=1;i<=n;i++){
            for(int j=0;j<=m;j++){
                f[i][j] = f[i-1][j];
                for(int k=1;k*v[i]<=j;k++)
                    if(j>=v[i]) f[i][j] = Math.max(f[i][j],f[i-1][j-k*v[i]]+k*w[i]);
            }
        }

        二维优化:

for(int i=1;i<=n;i++){
    for(int j=1;j<=V;j++){ 
        f[i][j] = f[i-1][j]; // 可能一件物品都装不下
        if(j>=v[i]) // 背包体积大于物品体积
            f[i][j] = Math.max(f[i][j],f[i][j-v[i]]+w[i]); 
    }
}

         一维优化:

for(int i=1;i<=n;i++)
    for(int j=v[i];j<=V;j++)
        f[j] = Math.max(f[j],f[j-v[i]]+w[i]);

例子:

有 N 种物品和一个容量是 V 的背包,每种物品都有无限件可用。

第 i 种物品的体积是 vi,价值是 wi。

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

输入格式

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

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

输出格式

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

数据范围

0<N,V≤1000
0<vi,wi≤1000

输入样例

4 5
1 2
2 4
3 4
4 5

输出样例:

10
import java.io.*;
import java.util.*;
 
class Main{
    static int N = 1010;
    static int n,V;
    static int[] v = new int[N]; // 体积
    static int[] w = new int[N]; // 价值
    static int[] f = new int[N]; // 二维
    public static void main(String[] args) throws IOException{
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        String[] s = in.readLine().split(" ");
        n = Integer.parseInt(s[0]);
        V = Integer.parseInt(s[1]);
        
        for(int i=1;i<=n;i++){
            s = in.readLine().split(" ");
            v[i] = Integer.parseInt(s[0]);
            w[i] = Integer.parseInt(s[1]);
        }
        
        // 完全背包:
        for(int i=1;i<=n;i++)
            for(int j=v[i];j<=V;j++)
                f[j] = Math.max(f[j],f[j-v[i]]+w[i]);
        System.out.println(f[V]); 
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1482573.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CV论文--2024.3.1

1、UniMODE: Unified Monocular 3D Object Detection 中文标题&#xff1a;UniMODE: 统一的单目三维物体检测 简介&#xff1a;实现统一的单目3D物体检测对于机器人导航等应用至关重要&#xff0c;涵盖了室内和室外场景。然而&#xff0c;训练模型需要涉及各种场景的数据&…

解决ODOO12 恢复数据库提示内存不够报错

1. 现象 点击 ‘restore database’ 控制台报错&#xff1a; 2. 解决措施 a. 进入启动脚本的文件夹 cd odoo/odoo-12.0/输入命令 ./odoo-bin --addons-pathaddons --databaseodoo --db_userodoo --db_passwordodoo --db_hostlocalhost --db_port5432 -i INITb. 刷新页面…

巧用眼精星票证识别系统将车辆合格证快速转为结构化excel数据,简单方便

眼精星票证识别系统是一款高效且精准的OCR软件&#xff0c;它的魔力在于能将纸质文档迅速转化为电子文档&#xff0c;并实现自动化的数据结构化处理。它拥有一双"火眼金睛"&#xff0c;无论是各类发票、护照&#xff0c;还是车辆合格证等&#xff0c;都能一一识别。而…

谷歌seo推广秒收录怎么做?

谷歌SEO推广秒收录想要做到&#xff0c;可以利用我们光算科技独家技术&#xff0c;GSI快速收录&#xff0c;通过技术手段和操作&#xff0c;帮你的网站快速被谷歌发现和记录 这项技术具体核心就是GPC爬虫池系统&#xff0c;这个系统是专门研究谷歌搜索引擎优化的规律和算法创造…

vulhub中Tomcat PUT方法任意写文件漏洞复现(CVE-2017-12615)

漏洞原理 漏洞本质Tomcat配置了可写&#xff08;readonlyfalse&#xff09;&#xff0c;导致我们可以往服务器写文件&#xff1a; <servlet><servlet-name>default</servlet-name><servlet-class>org.apache.catalina.servlets.DefaultServlet</s…

Rocky Linux 安装部署 Zabbix 6.4

一、Zabbix的简介 Zabbix是一种开源的企业级监控解决方案&#xff0c;用于实时监测服务器、网络设备和应用程序的性能和可用性。它提供了强大的数据收集、处理和可视化功能&#xff0c;同时支持事件触发、报警通知和自动化任务等功能。Zabbix易于安装和配置&#xff0c;支持跨平…

SD NAND:为车载显示器注入智能与安全的心脏

SD NAND 在车载显示器的应用 在车载显示器上&#xff0c;SD NAND&#xff08;Secure Digital NAND&#xff09;可以有多种应用&#xff0c;其中一些可能包括&#xff1a; 导航数据存储&#xff1a; SD NAND 可以用于存储地图数据、导航软件以及车载系统的相关信息。这有助于提…

[数据集][目标检测]鸡蛋破蛋数据集VOC+YOLO格式792张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;792 标注数量(xml文件个数)&#xff1a;792 标注数量(txt文件个数)&#xff1a;792 标注类别…

了解处理器

了解处理器 摘要写在前面1. 计算机简介1.1.计算机发展简史1.2.计算机分类1.3.PC机结构 2.初识处理器2.1.处理器的硬件模型2.2.处理器的编程模型2.3.处理器的分层模型2.4.如何选择处理器 3.指令集体系结构3.1.处理器编程模型3.2.指令集发展历程3.3.指令集分类3.4.汇编语言格式3.…

LeetCode240题:搜索二维矩阵II(python3)

代码思路&#xff1a; “根节点” 对应的是矩阵的 “左下角” 和 “右上角” 元素&#xff0c;以 matrix 中的左下角元素为标志数 flag &#xff0c;则有: 若 flag > target &#xff0c;则 target 一定在 flag 所在行的上方 &#xff0c;即 flag 所在行可被消去&#xff0c…

day10_日志模块AOP

文章目录 1 记录操作日志1.1 记录日志的意义1.2 日志数据表结构1.3 记录日志思想1.4 切面类环境搭建1.4.1 日志模块创建1.4.2 Log1.4.3 OperatorType1.4.4 LogAspect1.4.5 EnableLogAspect1.4.6 测试日志切面类 1.5 保存日志数据1.5.1 SysOperLog1.5.2 LogAspect1.5.3 AsyncOpe…

springcloud:3.4测试异常熔断降级

服务提供者【test-provider8001】 Openfeign远程调用服务提供者搭建 文章地址http://t.csdnimg.cn/06iz8 相关接口 测试远程调用&#xff1a;http://localhost:8001/payment/index 服务消费者【test-consumer-resilience4j8004】 Openfeign远程调用消费者搭建 文章地址http://t…

windows jdk 11.0.21版本安装配置

一、jdk下载官方网站&#xff1a; Java Archive | Oracle 二、下载对应jdk版本 此处我们选择jdk 11.0.21版本&#xff1a; 三、安装 下载完成后&#xff0c;建议以默认路径安装&#xff08;方便&#xff09;&#xff0c;也可以选择其他盘安装&#xff0c;按照提示点击下一步…

力扣-多数元素

问题 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 解答 class Solution {public int majorityElement(int[] nums) {Arrays…

WEB漏洞 SSRF简单入门实践

一、漏洞原理 SSRF 服务端请求伪造 原理&#xff1a;在某些网站中提供了从其他服务器获取数据的功能&#xff0c;攻击者能通过构造恶意的URL参数&#xff0c;恶意利用后可作为代理攻击远程或本地的服务器。 二、SSRF的利用 1.对目标外网、内网进行端口扫描。 2.攻击内网或本地的…

HTML教程(3)——常用标签(1)

一、图片标签 1.场景&#xff1a;在网页中显示图片 2.基本写法&#xff1a; <img src""> 3.特点&#xff1a;单标签&#xff0c;img标签需要展示对应的效果&#xff0c;需要借助其属性进行设置 4常用属性&#xff1a; src&#xff1a;其属性值为目标图片…

跨境知识分享:什么是动态IP?和静态IP有什么区别?

对于我们跨境人来说&#xff0c;清楚地了解IP地址、代理IP等这些基础知识&#xff0c;并学会正确地使用IP地址对于保障店铺的安全性和稳定性至关重要&#xff0c;尤其是理解动态IP和静态IP之间的区别&#xff0c;以及如何利用这些知识来防止账号关联&#xff0c;对于每个电商卖…

【Android】隐藏settings中的二级菜单

需求&#xff1a;隐藏安全性和位置信息下的安全更新二级条目 系统&#xff1a;Android8.1 代码地址&#xff1a;MtkSettings/src/com/android/settings/SecuritySettings.java private PreferenceScreen createPreferenceHierarchy() { .... PreferenceGroup securityStatusPr…

【JAVA】JDK内置工具之appletviewer

下载java 下载java的时候会先下载Java jdk&#xff0c;Java Development Kit Java开发工具包。 然后会下载jre&#xff0c;也就是Java Runtime Environment Java运行环境。什么是JDK、JRE&#xff1f;_java中的jdk,jre代表什么-CSDN博客 下载之后先找到java下的bin文件&#x…

Open3D0.14.1编译、安装、demo使用教程

写在前面 本文内容 Open3D在0.15版之前&#xff0c;没有提供编译好的包&#xff0c;要使用C版本必须自己编译&#xff0c;本文是Open3D0.14.1在Windows下和Linux(Ubuntu1804)下的编译、使用教程&#xff1b; Open3D其他版本的编译和使用相关教程见 各个版本的Open3D、PCL的编译…