趣味算法------单一背包问题(01背包问题)贪心算法解决

news2024/9/28 8:21:28

目录

​编辑

前言

例题

题目描述

输入输出格式

解题思路

具体代码

        C语言代码 

          python代码

总结


前言

        单一背包问题(0-1 Knapsack Problem)是组合优化中的一个经典问题,它可以形式化为:给定一组物品,每个物品都有一个重量和一个价值,目标是选择一些物品放入背包中,使得背包中物品的总价值最大,同时不超过背包的最大承重限制。在这个问题中,每个物品只能选择放或不放,不能分割。 

解决单一背包问题的方法包括动态规划、回溯算法和分支限界法等。动态规划是解决这类问题的常用方法,它通过构建一个二维数组来存储子问题的解,并使用状态转移方程来填充这个数组。状态转移方程通常表示为 dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]),其中 dp[i][j] 表示前 i 个物品放入容量为 j 的背包中所能获得的最大价值,w[i] 和 v[i] 分别表示第 i 个物品的重量和价值。 

在实际应用中,单一背包问题可以模拟旅行行李打包、投资组合选择、货物装载与运输、项目选择与管理、供应链管理、能源管理、课程安排和紧急救援物资分配等场景。 

例题

题目描述


有 N  件物品和一个容量是 V 的背包。每件物品只能使用一次。
第 i 件物品的体积是 vi ,价值是 wi 。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。

输入输出格式


输入格式
第一行两个整数N,V,用空格隔开,分别表示物品数量和背包容积。
接下来有 N 行,每行两个整数 vi wi,用空格隔开,分别表示第 i 件物品的体积和价值。
输出格式
一个非负整数,代表结果。

输入输出样例1
输入
4 5
1 2
2 4
3 4
4 5
输出
8

输入输出样例2
输入
1 2
2 2
输出
2

解题思路

  1. 初始化:首先,代码定义了背包的容量V和物品的数量N。然后,它为物品的重量和价值分配了动态数组weightsvalues,以及一个二维数组lst来存储动态规划过程中的状态值。

  2. 输入读取:代码使用scanf函数从标准输入读取物品的数量、背包容量以及每个物品的重量和价值。

  3. 动态规划填充:代码通过两层嵌套循环来填充动态规划数组lst。外层循环遍历物品,内层循环遍历背包的容量。对于每个容量和每个物品,代码检查当前物品是否可以放入背包中(即当前容量是否大于或等于该物品的重量)。如果可以,代码计算放入当前物品和不放入当前物品两种情况下的最大价值,并更新lst数组中相应位置的值。

  4. 结果输出:填充完成后,代码通过printf函数输出背包的最大价值,即lst[N][V]

具体代码

        C语言代码 

        

​
#include<stdio.h>
#include<stdlib.h>
#define maxlen 100
int main(void)
{
	int N, V;
	scanf("%d%d", &N, &V);
	int lst[maxlen][maxlen] = { 0 };
	int* weights = (int*)malloc(N * sizeof(int));
	int* values = (int*)malloc(V * sizeof(int));
	for (int i = 0; i < N; i++)
	{
		int s, r;
		scanf("%d%d", &s, &r);
		weights[i] = s;
		values[i] = r;
	}
	for(int i = 1;i<N+1;i++)
		for (int j = 1; j < V + 1; j++)
		{
			if (j < weights[i - 1])
				lst[i][j] = lst[i - 1][j];
			else
			{
				int datas1 = lst[i - 1][j];
				int datas2 = lst[i - 1][j - weights[i - 1]] + values[i - 1];
				
                if (datas1 > datas2)
					lst[i][j] = datas1;
				else
					lst[i][j] = datas2;
                
                lst[i][j]=(datas1>datas2)?datas1:datas2;
			}
		}
	printf("%d", lst[N][V]);
		
	return 0;
	
}

​

          python代码

N,V = [int(i) for i in input().split()]
lst = []
weights = []
values = []
for i in range(N):
    w,v = [int(i) for i in input().split()]
    weights.append(w)
    values.append(v)
for i in range(N+1):
    lst.append([0]*(V+1))
for i in range(1,N+1):
    for j in range(1,V+1):
        if j<weights[i-1]:
            lst[i][j] = lst[i-1][j]
        else:
            datas1 = lst[i-1][j]
            datas2 = lst[i-1][j-weights[i-1]]+values[i-1]
            lst[i][j] = max(datas1,datas2)
print(lst[N][V])

总结

        

单一背包问题是组合优化问题中的一个经典问题,它可以通过动态规划算法高效解决。在这个问题中,目标是选择一组物品放入背包中,使得背包的总价值最大,同时不超过背包的容量限制。动态规划算法通过构建一个二维状态数组来存储子问题的最优解,并通过状态转移方程递归地求解每个子问题,最终得到整个问题的最优解。

动态规划解决单一背包问题的关键在于定义合适的状态和状态转移方程。状态通常定义为dp[i][j]表示前i个物品放入容量为j的背包中所能获得的最大价值。状态转移方程为dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]),其中w[i]v[i]分别是第i个物品的重量和价值。如果当前背包容量不足以容纳第i个物品,则状态转移方程简化为dp[i][j] = dp[i-1][j]

动态规划算法的时间复杂度为O(N*V),其中N是物品的数量,V是背包的容量。空间复杂度也是O(N*V),但可以通过使用一维数组进行空间优化,将空间复杂度降低到O(V)

在实际应用中,动态规划不仅能够解决单一背包问题,还可以扩展到完全背包问题、多重背包问题等变体。动态规划的思想在解决这类优化问题时展现了其强大的能力,通过将大问题分解为小问题并存储子问题的解,动态规划避免了重复计算,提高了算法效率。

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

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

相关文章

微信小程序SSL证书

微信小程序开发投入项目使用就需要用到SSL证书&#xff0c;主要原因SSL证书是让服务器的数据采取加密协议传输&#xff0c;避免来自中间人劫持或数据泄漏&#xff0c;所以在小程序交互数据过程中起到了关键性的作用。 为考虑到多个手机版本的兼容性&#xff0c;所以微信小程序…

Linux提升篇-Linux虚拟网络介绍

一、Linux虚拟网络-网桥 和tap/tun、veth-pair 一样&#xff0c;Bridge 也是一种虚拟网络设备&#xff0c;所以具备虚拟网络设备的所有特性&#xff0c;比如可以配置 IP、MAC 等。 除此之外&#xff0c;Bridge 还是一个交换机&#xff0c;具有交换机所有的功能。 对于普通的网…

移远通信精彩亮相IOTE 2024:探究技术融合,展望智慧未来

8月28-30日&#xff0c;IOTE 2024 第二十二届国际物联网展在深圳正式拉开帷幕&#xff0c;此次活动汇聚全球800家参展企业、10万来自工业、物流、基础建设、智慧城市、智慧零售领域的集成商、终端用户参观展会。 延续着2023年的辉煌成果&#xff0c;在2024 IOTE展上&#xff0c…

Mamba介绍,和Transformer对比

本文根据“一文看懂Mamba&#xff0c;Transformer最强竞争者”&#xff08;机器之心 编辑&#xff1a;Panda&#xff09;一文修改&#xff0c;并补充了一些新的观点。 在深度学习领域的广阔天地中&#xff0c;随着技术的不断进步&#xff0c;对更高效、更强大模型架构的探索从未…

Anaconda和Pycharm超详细安装教程(2024版本)!pycharm配置anaconda运行环境!

目录 一、anaconda下载安装 二、pycharm配置anaconda环境 工欲善其事&#xff0c;必先利其器。 安装包、激活码&#xff08;pycharm、anaconda、python&#xff09;点击领取 一、anaconda下载安装 1. Anaconda介绍 Anaconda 是一个基于 Python 的数据处理和科学计算平台&…

Dell 服务器 PowerEdge T440 驱动器故障

目录 1.故障&#xff1a;Dell 服务器 PowerEdge T440 驱动器指示灯闪烁 2.解决方案 1.故障&#xff1a;Dell 服务器 PowerEdge T440 驱动器指示灯闪烁 2024年8月30日 Dell PowerEdgeT440 驱动器指示灯琥珀色闪烁 查看 RAID5 磁盘组属性 显示 Virtual Disk 0:RAID5 降级 De…

Yolov10(yolov8代码里兼容版本)推理代码解析,抛去nms,大道至简

一、模型的输出头 下载官方的yolov8代码库https://github.com/ultralytics/ultralytics 打开ultralytics/nn/modules/head.py&#xff0c;主要需要看一下模型的输出头是如何做训练和预测推理。 v10检测头继承与常规的检测头Detect&#xff0c;初始化里重构了一下分类的输出头…

pacs图像打不开怎么办 --日常工作总结

先强调一下,我不是专门做图像入库和图像归档,我负责的是临床这边的影像,下面是占在我的业务日常分析总结的哈,(不太专业,勿喷) 我们经常会遇到在打开某个检查的时候,出现黑框,日志定位wado服务取不到图 这种情况一般分为 (1) 工作站,工作组,路由,存储卷配置缺失 ---对应的wad…

【C语言从不挂科到高绩点】05-流程控制语句-switch语句

Hello&#xff01;彦祖们&#xff0c;俺又回来了&#xff01;&#xff01;&#xff01;&#xff0c;继续给大家分享 《C语言从不挂科到高绩点》课程 本套课程将会从0基础讲解C语言核心技术&#xff0c;适合人群&#xff1a; 大学中开设了C语言课程的同学想要专升本或者考研的…

Linux上启动redis

1.默认启动方式:在系统的任意位置执行 redis-server即可启动 ps:这是前端界面启动&#xff0c;无法直接连接redis&#xff0c;想要连接的话只能另外启动一个窗口&#xff0c;因此下面我们介绍后台启动redis 2.指定配置启动&#xff1a; redis的配置文件位置&#xff1a…

二叉树的基本知识

&#xff08;写给未来遗忘的自己&#xff09; 1.二叉树的种类 1. 满二叉树&#xff1a;所有分支都有数&#xff08;都填满&#xff09; 2. 完全二叉树&#xff1a;除了最底层没填满外其他的都满了&#xff0c;而且最底层从左到右是存在数的位置是连续的 3.二叉搜索树&#xf…

大学开学必备好物清单有哪些?开学必备清单大全,超详细版!

即将踏入大学校园的新生们&#xff0c;是否已经准备好迎接全新的挑战与机遇呢&#xff1f;在开学之前&#xff0c;将必备物品筹备妥当是极为重要的事情&#xff0c;因为这能够助力大家更为良好地适应大学生活。接下来&#xff0c;为大家提供一份实用的大学生开学必备物品清单&a…

性能测试面试题总结

最近这一年&#xff0c;对性能测试有了更多的认知。 压力、强度测试&#xff1a;在一定软硬件环境下&#xff0c;通过高负载的手段来使服务器资源&#xff08;强调服务器资源&#xff0c;硬件资源&#xff09;处于极限状态&#xff0c;测试系统在极限状态下长时间运行是否稳定…

大模型微调---qwen实战

一、Qwen大模型的介绍 Qwen是阿里云开发的大语言模型&#xff0c;整个qwen系列的模型&#xff0c;由base模型、rm模型、chat模型、code模型、math模型等等。 qwen采用chatml样式的格式来进行模型训练&#xff0c;chatml格式可以时模型有效区分各类信息&#xff0c;可以增强模…

blender插件库

插件安装教程&#xff1a;blender4.2中安装插件的方式-CSDN博客 blender官网插件库地址&#xff1a;Add-ons — Blender Extensions 1&#xff0c;ExtraObjects&#xff1a;提供更多网格形状&#xff0c; 链接:https://caiyun.139.com/m/i?2gov6Lw5RAib8 提取码:0ayj 复制内…

有向图的转置:算法分析与实现

有向图的转置:算法分析与实现 前言1. 邻接链表表示法2. 邻接矩阵表示法结论前言 在计算机科学中,图是一种非常重要的数据结构,用于表示对象之间的复杂关系。有向图(Directed Graph)是一种图,其边具有方向性。有向图的转置(Transpose)是一种基本操作,它将图中所有边的…

LLM面经(持续更新中)

Tokenizer Norm Batch Norm 好处 使得模型训练收敛的速度更快 每层的数据分布都不一样的话(解决Internal Covariance Shift)&#xff0c;将会导致网络非常难收敛和训练&#xff0c;而如果把每层的数据都在转换在均值为零&#xff0c;方差为1的状态下&#xff0c;这样每层数据…

第一个golang项目

第一个golang项目 开发环境安装golangVisual Studio Code安装golang语言插件初始化项目创建目录初始化golang配置 开始开发安装所需依赖创建main.go创建配置文件创建命令版本命令查看指定目录指定后缀文件并将指定内容替换为新内容 打包并运行 前因后果&#xff1a;因为工作需要…

不可错过的10款电脑监控软件推荐,电脑监控软件哪个好?宝藏安利

电脑监控软件已成为企业管理和家庭安全的重要工具。 无论是为了提升工作效率、保障信息安全&#xff0c;还是为了监督孩子的学习情况&#xff0c;一款优秀的电脑监控软件都能发挥巨大作用。 本文将为您推荐10款不可错过的电脑监控软件&#xff0c;并详细分析它们的优势与特点&…

Elastic Stack(三):Logstash介绍及安装

目录 1 Logstash介绍1.1 组件介绍1.2 Logstash 工作原理 2 Logstash安装2.1 logstash-源码包安装8.1.01、logstash安装2、创建配置文件3、启动4、配置快速启动文件 1 Logstash介绍 1.1 组件介绍 Logstash是一个开源数据收集引擎&#xff0c;具有实时管道功能。Logstash可以动…