0-1背包问题

C++ 实现 0-1 背包问题 1.什么是动态规划 首先介绍一下动态规划... 设计一个动态规划算法,通常可按照以下几个步骤进行: (1) 找出最优解的性质,并刻画其结构特征。 (2) 递归地定义最优解的值 (3) 以自底而上的方式计算出最优值 (4) 根据计算最优值时得到的信息,构造一个最优解。 对于一个给定的问题,若具有以下两个性质,则可以考虑用动态规划法来求解。 阅读详情

题目描述:有n件物品和一个容量为v的背包。第i件物品的重量是w[i],价值是p[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值和最大。

算法分析:

动态规划的题目一直是比较有难度,这种题目炸看往往连个思路都没有,往往需要数组记录信息来降低复杂度。解题的关键是找出状态转移方程。

假设f[i][v]表示前i件物品恰放入一个容量为v的背包所能取得的最大值。如果我们选取第i件物品,f[i][v]=f[i-1][v-c[i]]+w[i];如果不选取第i件物品,f[i][v]=f[i-1][v]。状态转移方程:f[i][v]=max{f[i-1][v],f[i-1][v-w[i]]+p[i]}。

代码如下:

int c[10][100];
int knapsack(int m,int n)
{
    int i,j,w[10],p[10];
    for(i=1;i<n+1;i++)
    scanf("\n%d,%d",&w[i],&p[i]);
    for(i=0;i<10;i++)
    for(j=0;j<100;j++)
    c[i][j]=0;
    for(i=1;i<n+1;i++)
    for(j=1;j<m+1;j++)
    {
        if(w[i]<=j){
             if(p[i]+c[i-1][j-w[i]]>c[i-1][j])
                 c[i][j]=p[i]+c[i-1][j-w[i]]; 
             else
                 c[i][j]=c[i-1][j];
        }else 
             c[i][j]=c[i-1][j];
     }
     return(c[n][m]);
}

这里一定要将w[i]和j进行比较,然后分类处理,我看到网上有一种错误的做法是for(j=w[i];...)开始循环,这样求得的c[i][j]是不正确的。因为f[i][v]=max{f[i-1][v],f[i-1][v-w[i]]+p[i]},即f[i][v]是俩种情况的最大值,当j<w[i]时,那种错误算法没有计算(仍旧是初始值0),而正确的做法是取f[i-1][v]。待会我会用俩张图片展示。理解此题的一个方法是自己画图。

下图正确的算法得到的:


下图是错误算法得到的:


由于错误算法c[i][j]的j从w[i]开始算法,所以j<w[i]时取零,这个地方会出错,据此我找到一中对应这种情况的测试用例。我们以f[3][6]举例。f[3][6]=max{f[2][6],f[2][6-5]+6}=max{7,0+6}=7。因为算法没有正确计算f[2][1]所以得到错误解

参考:

http://wenku.baidu.com/link?url=Un8HHHK091HRNcNb9MnrEwWfx1VhcZurBkIPC0k3hdfwHglCUX6H8etGqMFccEbW0aKP5UXH9W3hX4Bt016pDU1jzHxeuYrf0NSc2j-aUGe

:http://gengning938.blog.163.com/blog/static/128225381201141210513634/

动态规划 之 0-1背包问题 关于背包问题,其实可以分为两种类型:0-1背包问题 和 部分背包问题。 1、先通过一个例子来说明一下二者的区别吧! 有一个窃贼在偷窃一家商店时发现有n件物品,第i件物品价值为vi元,重量为wi,假设vi和wi都为整数。他希望带走的东西越值钱越好,但他的背包中之多只能装下W磅的东西,W为一整数。他应该带走哪几样东西? 0-1背包问题:每件物品或被带走,或被留下,(需要做出0-1选择)。小偷 阅读详情

相关推荐

蛮力法解决0/1背包问题

    使用蛮力法解决0/1背包问题,就是将所有的物品装入背包的可能全部列举出来。这个可以通过递归的方式实现。递归的过程可以看成是对一棵树的深度优先遍历:例如上图,假设从背包中的1号物品开始列举所有的可能。如果每一层仅仅简单的在循环中使用递归,则该程序就不会结束。需要使用一个一维向量用于标记当前哪些编号已经装入了。例如,当前1号物品已经装入背包,首先标记1号物品已经装入。之后,在循环中首先选择2号...

qq_36573282的博客 1万+

0-1背包问题(5种方法)

大家好,我是一只学弱狗,记录学习的点点滴滴! 优质文章 一张黄图的故事 JavaSE练习项目-坦克大战 我是菜鸟、我小试牛刀 linux指令太多记不住?小白看这篇就够了! 优质专栏 数据库就该这样学 爪哇外步篇 题目描述   有n件物品要装入背包,第i件物品的重量wi,价值vi,i=1,2,…,n,背包最多允许装入的重量为B,问如何选择装入背包的物品,使得总价值达到最大? 穷举法   解是一个取值只能是0或1的向量,最先考虑考虑的是穷举,即遍历出所有的情况,然后根据约束条件对所有情况进行筛选,.

qq_44486437的博客 3491

【Algorithm】0-1背包问题及其价值

0-1背包问题(0-1 Knapsack Problem)是一种组合优化问题,它是背包问题的一个特殊变体。在这个问题中,你给定一组物品,每个物品都有一个重量和一个价值。目标是选择一些物品放入背包中,使得背包中物品的总价值最大,同时不超过背包的最大承重限制。0-1背包问题的特点在于每个物品只能选择0个(不选)或1个(全选),不允许分割物品。给定一个物品集合,其中每个物品i都有一个重量w_i和一个价值v_i。背包有一个最大承重限制W。目标是找到一个物品的子集,使得子集中物品的总价值V。

格物致知 1107

四种不同算法求解0-1背包问题

0-1背包问题 一、  问题描述 1  0-1背包问题 现有n种物品,对1i,价值为正整数Vi,背包能承受的最大载重量为正整数W,现要求找出这n种物品的一个子集,使得子集中物品的总重量不超过W且总价值尽量大。在选择装人背包的物品时,对每种物品i只有两种选择,即装入背包、不装入背包。不能将物品i 装人背包多次,也不能只装入部分的物品i(注意:这里对每种物品或者全取或者一点都不取,不允许只取一部

lcw_2015的博客 3万+

非整数0-1背包问题

0-1背包问题通常情况下物品的重量是整数的,采用动态规划可以解决,在解决物品重量非整数情况下的背包问题之前,我们先来回顾整数背包问题,并从中寻找解决非整数背包问题的方法。 问题定义:有n种物品和一个容量为c的背包,第i件物品的重量为wi,价格为vi,求出哪种物品组合放入背包使物品价值总和最大...

chun2674的博客 2737

背包问题(0-1背包,完全背包,多重背包知识概念详解)

背包问题(0-1背包,完全背包,多重背包知识概念详解)内含实例代码解析,详细讲解了背包的基本概念及简单运用问题

背包问题之0-1背包问题

问题描述:有n个物品,第 i 个物品的重量与价值分别为 w[i]w[i]w[i] 与 v[i]v[i]v[i]。背包容量为 V,试问在每个物品最多使用一次(物品必须保持完整)的情况下,如何让背包装入的物品具有更大的价值总和。现有数据如下: w = [2,3,4,5]; v = [3,4,5,6]; V = 8; 解题思路:令 dp[i][j]dp[i][j]dp[i][j] 表示容量为 j 时放...

Lam Tang的博客 976

右腿驱动电路设计:从共模干扰原理到生物电采集实战

在生物电信号采集领域,共模干扰是影响测量精度的核心挑战之一,其本质源于环境电磁场通过容性耦合在人体表面产生的感应电流。根据欧姆定律,由于人体组织阻抗的不均衡性,共模电流会在不同测量点产生差异化的压降,从而转化为难以滤除的差分噪声。为解决这一问题,右腿驱动技术应运而生,它通过负反馈原理主动抵消干扰,显著提升系统的共模抑制比。该技术广泛应用于心电图、脑电图等医疗电子设备中,是确保微弱生理信号质量的关键环节。本文结合工程实践,深入剖析了右腿驱动电路中的仪表放大器选型、反馈环路稳定性设计以及PCB布局布线要点,为高

weixin_31476015的博客 442

彻底理解0-1背包问题

0-1背包问题 给定n个重量为w1、w2、w3、…、wn,价值为v1、 v2​、v3​、 …、vn​的物品和容量为C的背包,求这个物品中一个最有价值的子集,使得在满足背包的容量的前提下,包内的总价值最大 0-1背包问题指的是每个物品只能使用一次 递归方法 首先我们用递归的方式来尝试解决这个问题 我们用F(n,C)表示将前n个物品放进容量为C的背包里,得到的最大的价值。 我们用自顶向下的角度...

carcarrot的博客 2435

企业碳排放计算方法与实践:从年度总量到月度分配的完整流程

本文系统介绍了企业碳排放计算的全流程方法,包括数据预处理、能源活动与产品生产碳排放计算、年度汇总及月度分配优化。通过ARIMA模型预测补充缺失数据,采用二次规划算法实现基于用电量模式的月度碳排放分配,确保计算结果的准确性与合理性。该方法为企业碳排放管理提供了科学工具,有助于精准监控排放、制定减排策略并满足合规要求。实施中需注重数据质量控制和排放因子选择,并根据企业特点调整参数。该流程适用于制造业企业,为实现碳中和目标提供可靠的数据基础和管理支持。

applehunqiu的博客 1572

WSL2 + Open3D点云可视化踩坑全记录:从GLFW报错到VcXsrv配置,一篇讲清所有‘坑’

本文详细解析了在WSL2环境中使用Open3D进行点云可视化时遇到的常见问题,特别是GLFW报错和VcXsrv配置问题。通过系统性的解决方案和高级配置技巧,帮助开发者彻底解决图形显示、驱动加载和库版本冲突等难题,实现高效的点云可视化。

weixin_30627341的博客 101

九种 0-1 背包问题详解

目录 动态规划概念 问题1:0-1背包问题 问题2:完全背包问题 问题3:多重背包问题 问题4:混合背包问题 问题5:二维背包问题 问题6:分组背包问题 问题7:有依赖的背包问题(困难) 问题8:背包问题求方案数 问题9:背包问题求具体方案 前言 0-1 背包是一个经典的问题,之前也整理过一篇关于 0-1 背包的博客,当时只是整理了 0-1 背包问题的4 种解决方法。最近在复习算法,发现有很多 0-1 背包问题的衍生问题。0-1 背包问题的限制条件既可以是重量,也可以是容量,或者..

Tyler_Zx的博客 2万+

Altium Designer操作技巧(1)——原理图中如何批量替换元器件?

《AltiumDesigner批量替换元器件技巧分享》摘要:本文介绍了两种在AltiumDesigner中批量替换元器件的实用方法。方法一通过“查找相似对象”功能,可精准匹配并批量修改器件参数;方法二利用ActiveBOM功能,在BOM表中直观操作器件替换,推荐使用第二种方法可使BOM管理更高效。这些技巧能有效减少物料种类、降低贴装成本,特别适用于电阻电容等常用器件的批量替换。关注公众号获取更多电子设计技巧。

u012526819的博客 2578

0 - 1背包问题

什么是0 - 1背包 首先看一波百度词条对于 “0 - 1背包问题” 的阐述: 01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为W1,W2至Wn,与之相对应的价值为P1,P2至Pn。01背包是背包问题中最简单的问题。01背包的约束条件是给定几种物品,每种物品有且只有一个,并且有权值和体积两个属性。在01背包问题中,因为每种物品只有一个,对于每个物品只需要考虑选与不选两种情况。如果不选择将其放入背包中,则不需要处理。如果选择将其放入背包中,由于不清楚之前放入的物品占据了多大的空间,需要枚举

nepu_bin的博客 3223

SimpleFOC STM32实战:基于F103与HAL库,剖析速度环与电流环的协同控制

本文详细介绍了基于STM32F103与HAL库的SimpleFOC实战应用,重点剖析速度闭环控制与电流环的协同工作原理。通过开发环境搭建、参数调试技巧及性能优化方案,帮助开发者高效实现无刷电机精准控制,适用于机器人、无人机等高精度应用场景。

weixin_29170327的博客 476

FPGA经验谈系列文章——3、逻辑级数

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Xilinx FPGA开发tips系列——前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的

gzy0506的博客 1万+

0-1 背包问题

小溪汇入河流,江河汇入大海。 动态规划将小问题的解汇集成大问题的答案,一步步引领我们走向解决问题的彼岸。

yuebo_zhao的博客 1410

基于STM32L4XX、HAL库的RTL8201F 以太网收发器(PHY)驱动程序设计

define PHY_RESET_DELAY 1000 // PHY复位延迟(ms)#define PHY_AUTONEGO_DELAY 3000 // 自动协商延迟(ms)/* 检查PHY ID (RTL8201F的ID为0x001CC816) *//* 系统时钟配置,确保ETH有50MHz时钟 *//* 初始化CPU, AHB和APB总线时钟 */

zhusl6688的博客 803

背包问题(0-1背包问题和完全背包问题)

一. 0-1背包问题 给了一些物品的重量和价值,背包只能装下一定重量的物品,求背包能装物品的最大价值(0-1背包问题约定每个物品最多只能用一次)。 w = [5, 4, 7 ,2 ,6] #重量 p = [12,3,10, 3, 6] #价值 v = 12 #包能装下的总重量 n = 5 #物品个数 1)不超过总重量(不要求装满)的情况下,价值最大 w = [5, 4, 7 ,2 ,6...

冷咖啡离开了杯垫,来到了博客 1375

Debezium系列之:使用指定值替代指定字段的值

Debezium系列之:使用指定值替代指定字段的值

zhengzaifeidelushang的博客 306

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

0/1背包问题

0/1背包问题 文章目录0/1背包问题【问题描述】【问题分析】【算法设计】【算法分析】 【问题描述】 给定nnn种物品和一个背包,物品iii(1≤i≤n1 \leq i \leq n1≤i≤n)的重量是ωi\omega_iωi​,其价值是viv_ivi​,背包的容量为CCC,对于每种物品只有两种选择,即装入背包或不装入背包。问题是如何选择装入背包的物品使得装入背包的物品的总价值最大? 【问题分析】...

liuxiaocs7的博客 2611

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

0-1背包问题、完全背包问题、多维背包问题详讲及代码示例

0-1背包问题 有 N 件物品和一个容量为 V 的背包。放入第 i 件物品耗费的费用是 Ci(即占用背包的空间容量),得到的价值是 Wi。 求解将哪些物品装入背包可使价值总和最大。 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。 二维数组0-1背包问题的状态转移方程: F[i, v] = max{F[i − 1, v], F[i − 1, v − Ci] + Wi} 一维数组0-1背包问题的状态转移方程(优化后节省了空间): F[v] = max{F[v], F[v − Ci]

m0_46613023的博客 8985

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

0-1背包问题的优化

n是物品的个数,c是物品的容量。对于0-1背包问题,它的时间优化空间已经非常小了,但是空间还有很大的优化空间。 0-1背包问题相应的状态转移方程 对于状态转移方程,它有这样的一个特点,每一次只更新一行的内容,而每一次所更新的那一行的内容,比如第i行的内容,它只依赖于第i-i行的内容,而不用去考虑i-1行之前的那些元素具体是什么样子的。换句话说,只要求出一行,就能求出下...

nicolelili1的专栏 4448
上一篇: 面试经典(11)--二叉树层次遍历
下一篇: 面试经典(10)--归并排序
OS技术解密
博客等级 码龄16年 3760粉丝 189原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值