动态规划--0-1背包问题

动态规划

  • 动态规划--0-1背包问题
    • 穷举法(把所有情况列出来,比较得到总价值最大的情况)
    • 动态规划算法
      • 01背包问题递归实现(不带备忘录的自顶向下法)
      • 01背包问题-递归实现(带备忘的自顶向下法)
      • 01背包问题(自底向上法)

动态规划–0-1背包问题

问题描述:
假设现有容量m kg的背包,另外有 i 个物品,重量分别为w[1] w[2]…w[i] (kg),价值分别为p[1]、p[2]…p[i] (元),将哪些物品放入背包可以使得背包的总价值最大?最大价值是多少?
(示例一:m=10 i=3重量和价值分别为3kg-4元,4kg-5元 ,5kg-6元)

穷举法(把所有情况列出来,比较得到总价值最大的情况)

  1. 如果容景增大,物品增多,这个方法的运行时间将成指数增长
  2. 每一个物品都有两种状态(放与不放,0和1状态),所以如果有n个物品,就有2的n次方种情况
internal class Program
{static void Main(string[] args){int m;int[] w = { 0, 3, 4, 5 };int[] p = { 0, 4, 5, 6 };Console.WriteLine(Exhaustivity(10,w,p));Console.WriteLine(Exhaustivity(3,w,p));Console.WriteLine(Exhaustivity(4,w,p));Console.WriteLine(Exhaustivity(5,w,p));Console.WriteLine(Exhaustivity(7,w,p));}public static int Exhaustivity(int m, int[] w,int[] p){int i = w.Length - 1;//物品的个数int maxPrice = 0;for(int j = 0; j < Math.Pow(2,m); j++){//取得j 上某一个位的二进制值int weightTotal =  0;int priceTotal = 0;for(int number = 1; number <= i; number++){int result = Get2(j, number);if (result == 1){weightTotal += w[number];priceTotal += p[number];}}if(weightTotal <= m && priceTotal > maxPrice){maxPrice = priceTotal;}}return maxPrice;}public static int Get2(int j, int number){int A = j;int B = (int)Math.Pow(2,number - 1);int result = A & B;if(result == 0){return 0;}return 1;}
}

动态规划算法

我们要求得 i 个物体放入容量为m(kg)的背包的最大价值(记为c[i,m])。在选择物品的时候,对于每种物品只有两种选择,即装入背包或不装入背包。某种物品不能装入多次(可以认为每种物品只有一个),因此该问题被称为0-1背包问题

对于c[i,m]有下面几种情况:

  1. c[i,0]=c[0,m]=0
  2. 当w[i]>m时 ,c[i,m]=c[i-1,m] (最后一个物品的重量大于容量,直接舍弃不用)
  3. 当w[i]<=m的时候有两种情况,一种是放入i,一种是不放入i
    • 不放入i,c[i,m]=c[i-1,m]
    • 放入i ,c[i,m]=c[i-1,m-w[i]+p[i]
    • c[i,m]=max(不放入i,放入i)

01背包问题递归实现(不带备忘录的自顶向下法)

internal class Program
{static void Main(string[] args){int m;int[] w = { 0, 3, 4, 5 };int[] p = { 0, 4, 5, 6 };Console.WriteLine(UpDown(10,3,w,p));Console.WriteLine(UpDown(3,3,w,p));Console.WriteLine(UpDown(4,3,w,p));Console.WriteLine(UpDown(5,3,w,p));Console.WriteLine(UpDown(7,3,w,p));}//m是背包容量//i是物品个数//wp是物品的重量和价值的数组public static int UpDown(int m, int i,int[] w, int[] p ) //返回值是m可以存储的最大价值{if (i == 0||m== 0){return 0;}if (w[i] > m){return UpDown(m,i-1,w, p );}else{int maxValue1 = UpDown(m - w[i], i - 1, w, p ) + p[i];int maxValue2 = UpDown(m, i - 1, w, p );if (maxValue1 > maxValue2){return maxValue1;}return maxValue2;}}
}

01背包问题-递归实现(带备忘的自顶向下法)

internal class Program
{public static int[,] result = new int[11, 4];static void Main(string[] args){int m;int[] w = { 0, 3, 4, 5 };int[] p = { 0, 4, 5, 6 };Console.WriteLine(UpDown(10, 3, w, p));Console.WriteLine(UpDown(3, 3, w, p));Console.WriteLine(UpDown(4, 3, w, p));Console.WriteLine(UpDown(5, 3, w, p));Console.WriteLine(UpDown(7, 3, w, p));}//m是背包容量//i是物品个数//wp是物品的重量和价值的数组public static int UpDown(int m, int i, int[] w, int[] p) //返回值是m可以存储的最大价值{if (i == 0 || m == 0){return 0;}if (result[m,i]!=0){return result[m,i];}if (w[i] > m){result[m,i] = UpDown(m, i - 1, w, p);return result[m,i];}else{int maxValue1 = UpDown(m - w[i], i - 1, w, p) + p[i];int maxValue2 = UpDown(m, i - 1, w, p);if (maxValue1 > maxValue2){result[m, i] = maxValue1;}else{result[m,i] = maxValue2;}return result[m,i];}}
}

01背包问题(自底向上法)

internal class Program
{static void Main(string[] args){int m;int[] w = { 0, 3, 4, 5 };int[] p = { 0, 4, 5, 6 };Console.WriteLine(BottomUp(10,3, w, p));Console.WriteLine(BottomUp(3, 3, w, p));Console.WriteLine(BottomUp(4, 3, w, p));Console.WriteLine(BottomUp(5, 3, w, p));Console.WriteLine(BottomUp(7, 3, w, p));}public static int[,] result = new int[11, 4];public static int BottomUp(int m,int i, int[] w, int[] p){if (result[m,i] != 0)return result[m,i];for (int tempM = 1; tempM < m+1; tempM++){for(int tempI = 1; tempI <i+1;tempI++){if (result[tempM,tempI] != 0 )continue;if (w[tempI] >tempM){result[tempM, tempI] = result[tempM, tempI - 1];}else{int maxValue1 = result[tempM - w[tempI], tempI-1]+p[tempI];int maxValue2 = result[tempM, tempI - 1];if (maxValue1 > maxValue2){result[tempM, tempI] = maxValue1;}else{result[tempM,tempI] = maxValue2;}}}}return result[m,i];}
}

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

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

相关文章

若依表格默认勾选某列复选框方法

条件成立禁用checkbox返回(disabled : true)即可。 {checkbox: true,formatter: function (value, row, index) {if($.common.equals("ry", row.loginName)){return { checked : true}} else {return { checked : false}}} } 注意事项:如果默认勾选,并且配置了 r…

私有云和多云管理平台 | Cloudpods v3.10.15 正式发布

功能优化 【主机】裸金属详情页增加部分属性信息【监控】优化告警策略&#xff0c;支持同时设置多监控指标【主机】支持透传设备自动探测【主机】LVM 块存储支持快照【监控】简化 Telegraf 容器的挂载点【主机】新建 VMware 支持同时填写备注信息【存储】KVM 支持对接 LVM 存储…

ubuntu2404 AMD64 编译并安装virtualbox7.0.18

ubuntu2404 AMD64 编译并安装virtualbox7.0.18 0、官方参考文档&#xff1a; https://www.virtualbox.org/wiki/Linux%20build%20instructions 1、下载源码&#xff1a; $ wget https://download.virtualbox.org/virtualbox/7.0.18/VirtualBox-7.0.18.tar.bz2 2、安装库&…

【MySQL精通之路】SQL优化(1)-查询优化(13)-条件过滤

在联接处理中&#xff0c;前缀行是从联接查询中的一个表传递到下一个表的那些行。 通常&#xff0c;优化器会尝试在联接查询的早期放置前缀计数较低的表&#xff0c;以防止行组合的数量快速增加。 在某种程度上&#xff0c;优化器可以使用从一个表中选择并传递到下一个表的行…

连接池笔记\JDBC的API\ACID属性\数据并发问题

1-池化思想 字符串常量池、数据库连接池、线程池 频繁使用的东西&#xff0c;不要每次都去创建 没连接池之前&#xff1a; &#xff08;1&#xff09;获取连接 &#xff08;2&#xff09;进行sql操作 &#xff08;3&#xff09;断开连接 存在问题 &#xff08;1&#xff09;每次…

AI学习指南数学工具篇-凸优化基础知识凸集

AI学习指南数学工具篇-凸优化基础知识凸集 在人工智能领域中&#xff0c;凸优化是一个非常重要的数学工具&#xff0c;而凸集作为凸优化的基础知识之一&#xff0c;扮演着至关重要的角色。本篇博客将围绕凸集展开讲解&#xff0c;包括凸集的定义、性质以及详细的示例&#xff…

2024最新彩虹聚合DNS管理系统源码v1.3 全开源

2024最新彩虹聚合DNS管理系统源码v1.3 全开源 聚合DNS管理系统可以实现在一个网站内管理多个平台的域名解析&#xff0c;目前已支持的域名平台有&#xff1a;阿里云、腾讯云、华为云、西部数码、DNSLA、CloudFlare。 本系统支持多用户&#xff0c;每个用户可分配不同的域名解…

深入探索Kafka:了解其不可或缺的核心组件

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《数据流专家&#xff1a;Kafka探索》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Kafka简介 2、Kafka的应用场景 3、Kafka与其他消…

【LeetCode刷题】有效三角形个数、查找总价值为目标值的两个商品

【LeetCode刷题】Day 5 题目1&#xff1a;611.有效三角形个数思路分析&#xff1a;思路1&#xff1a;暴力枚举O(N^3^)思路2&#xff1a;单调性&#xff0c;双指针解法O(NlogNN^2^) 题目2&#xff1a;LCR 179.查找总价格为目标值的两个商品思路1&#xff1a;暴力枚举O(N^2^)思路…

网络协议——Modbus-RTU

目录 1、简介 2、消息格式 3、Modbus寄存器种类说明 4、功能码01H 5、功能码02H 6、功能码03H 7、功能码04H 8、功能码05H 9、功能码06H 10、功能码0FH 11、功能码10H 1、简介 Modbus-RTU&#xff08;Remote Terminal Unit&#xff09;是一种串行通信协议&#xff0…

SpringMVC源码解读[1] -Spring MVC 环境搭建

源码地址: https://github.com/chen-jiacheng/springmvc-quickstart 一、使用 IDEA 创建 Spring MVC 项目 直接创建项目即可 默认项目结构: springmvc-quickstart ├── pom.xml └── src├── main│ ├── java│ │ └── com│ │ └── chenjiache…

Stable Diffusion简单食用方法

1.下载 1.1打开B站 哔哩哔哩 (゜-゜)つロ 干杯~-bilibili哔哩哔哩&#xff08;bilibili.com)是国内知名的视频弹幕网站&#xff0c;这里有及时的动漫新番&#xff0c;活跃的ACG氛围&#xff0c;有创意的Up主。大家可以在这里找到许多欢乐。https://www.bilibili.com/ 1.2搜索…

521源码-免费教程-Linux系统硬盘扩容教程

本教程来自521源码&#xff1a;更多网站源码下载学习教程&#xff0c;请点击&#x1f449;-521源码-&#x1f448;获取最新资源 首先&#xff1a;扩容分区表 SSH登陆服务器输入命令&#xff1a;df -TH&#xff0c;获得数据盘相关信息 可以看到演示服务器的数据盘分区是&…

Java中的封装、继承和多态性详解

一、封装 技术难点 封装是面向对象编程的四大基本特性之一&#xff0c;它的主要目标是隐藏对象的内部状态和信息&#xff0c;只对外提供有限的访问接口。技术难点在于如何合理地设计类的私有成员变量和公有方法&#xff0c;以确保数据的安全性和操作的便捷性。封装要求开发者…

CentOS历史命令查询、用户操作审计

目录 历史命令查询 常规方法 直接解析历史命令文件&#xff08;推荐&#xff09; 用户操作审计 sudo日志 audit日志 systemd日志&#xff08;推荐&#xff09; 历史命令查询 常规方法 # 显示历史命令 history# 增加时间显示&#xff1a; # 临时生效 export HISTTIMEFO…

UVa1086/LA4452 The Minister’s Major Mess

UVa1086/LA4452 The Minister’s Major Mess 题目链接题意分析AC 代码 题目链接 本题是2009年icpc世界总决赛的H题 题意 n&#xff08;n≤500&#xff09;个人对m&#xff08;m≤100&#xff09;个方案投票。每个人最多只能对其中的4个方案投票&#xff08;其他相当于弃权票&a…

FastJSON2 > FastJSON 好在何处

FastJSON 是一种广泛使用的 JSON 解析库&#xff0c;其高性能和简单易用的特点受到开发者的喜爱。然而&#xff0c;随着应用场景的复杂化和安全要求的提高&#xff0c;FastJSON 逐渐暴露出一些问题。为了解决这些问题并进一步提升性能和安全性&#xff0c;阿里巴巴推出了 FastJ…

Linux基础入门和帮助-第一篇

马哥教育 Linux SRE 学习笔记 Linux基础 备注&#xff1a;本笔记使用Linux版本为Rocky 8.6和Ubuntu 23.10&#xff0c;大部分使用Rocky 8.6 查看当前的终端设备 tty命令可以查看当前所在的终端 范例&#xff1a; [rootrocky8 ~]$tty /dev/pts/0bash shell 显示当前使用的she…

css扇形菜单动画效果

菜单组件 IntelligentAnalysis.vue 中间圆形区域可以换个图片 <template><div class"intel-analysis"><div class"info" :class"{ close-animation: !showMenu }"><div class"middle"></div><div cl…

【工具使用】搜狗输入法如何输入希腊字母等特殊字符

步骤&#xff1a; 1&#xff0c;点击悬浮框的输入方式&#xff0c;选择“符号大全”&#xff1a; 2&#xff0c;根据自己需要选择对应的符号即可&#xff1a;