01背包问题动态规划详解

动态规划之0-1背包问题(详解+分析+原码) 本篇文章将介绍算法专题之动态规划中的背包问题,更准确的说是背包问题中最简单的一种类型,即0-1背包问题,就是给你一定容量的背包和若干物品,每种物品只能选一次,告诉你每件物品的价值和体积,求背包里面物品的最大总价值。 阅读详情

动态规划是用空间换时间的一种方法的抽象。其关键是发现子问题和记录其结果。然后利用这些结果减轻运算量。
比如01背包问题。

/* 一个旅行者有一个最多能用M公斤的背包,现在有N件物品,
它们的重量分别是W1,W2,...,Wn,
它们的价值分别为P1,P2,...,Pn.
若每种物品只有一件求旅行者能获得最大总价值。
输入格式:
M,N
W1,P1
W2,P2
......
输出格式:
X
*/

因为背包最大容量M未知。所以,我们的程序要从1到M一个一个的试。比如,开始任选N件物品的一个。看对应M的背包,能不能放进去,如果能放进去,并且还有多的空间,则,多出来的空间里能放N-1物品中的最大价值。怎么能保证总选择是最大价值呢?看下表。
测试数据:
10,3
3,4
4,5
5,6

c[i][j]数组保存了1,2,3号物品依次选择后的最大价值.

这个最大价值是怎么得来的呢?从背包容量为0开始,1号物品先试,0,1,2,的容量都不能放.所以置0,背包容量为3则里面放4.这样,这一排背包容量为4,5,6,....10的时候,最佳方案都是放4.假如1号物品放入背包.则再看2号物品.当背包容量为3的时候,最佳方案还是上一排的最价方案c为4.而背包容量为5的时候,则最佳方案为自己的重量5.背包容量为7的时候,很显然是5加上一个值了。加谁??很显然是7-4=3的时候.上一排c3的最佳方案是4.所以。总的最佳方案是5+4为9.这样.一排一排推下去。最右下放的数据就是最大的价值了。(注意第3排的背包容量为7的时候,最佳方案不是本身的6.而是上一排的9.说明这时候3号物品没有被选.选的是1,2号物品.所以得9.)

从以上最大价值的构造过程中可以看出。

f(n,m)=max{f(n-1,m), f(n-1,m-w[n])+P(n,m)}这就是书本上写的动态规划方程.这回清楚了吗?

下面是实际程序:

#include<stdio.h>
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]*/
                            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]);
                    
}
int main()
{
    int m,n;int i,j;
    scanf("%d,%d",&m,&n);
    printf("Input each one:/n");
    printf("%d",knapsack(m,n));
    printf("/n");/*下面是测试这个数组,可删除*/
     for(i=0;i<10;i++)
      for(j=0;j<15;j++)
         {
          printf("%d ",c[i][j]);
             if(j==14)printf("/n");
         }
    system("pause");
}

C++ 算法篇 动态规划----背包之一 01背包 一、01背包 题目:有 N 件物品和一个容量为 V 的背包。第 i 件物品的费用是 w[i],价值是 p[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。 例,有3个物品,背包容量为10,如下: 二维解法: #include<bits/stdc++.h> using namespace std; int f[50][220]={... 阅读详情

相关推荐

动态规划法改进:用序偶法求0/1背包问题

动态规划法改进:用序偶法求0/1背包问题 1、问题 2、方法 3、实现代码 ////序偶法求0/1背包问题(动态规划法改进版) //// by 孙琨SealSun at UCAS //// 2015.11.20 #include using namespace std; #define MAX 256 void Kna

孙琨SealSun 5599

动态规划——0/1背包问题(全网最细+图文解析)

01背包你真的掌握了吗?进来带你10分钟秒杀

Biteht的博客 6万+

遥感新手别纠结!实测ENVI 5.3、5.6、6.0三个免费版,教你混搭安装避坑

本文为遥感新手提供ENVI 5.3、5.6、6.0三个免费版的实测对比与混搭安装指南,帮助用户构建零成本高效工作流。详细解析各版本功能差异、共存安装技巧及常见问题解决方案,特别适合课程作业、毕业论文分析和遥感入门练习。

weixin_30819085的博客 474

动态规划(01背包问题)

本文对动态规划的01背包问题进行了解释和阐述。

会思想的苇草i的博客 4290

多思计算机组成原理实验:模型机课程设计

计算机组成原理实验教程 基于多思网络虚拟实验系统 张雯雰

Nick的博客 2万+

告别拼音!用VSCode+Dosbox-X搞定汇编语言课程设计里的中文姓名显示

本文详细介绍了如何利用VSCode和Dosbox-X解决汇编语言课程设计中中文姓名显示的问题。通过配置开发环境、理解GB2312编码及正确使用汇编指令,学生可以告别拼音显示,实现中文字符的正确输出。文章还提供了完整的代码示例和常见问题排查方法,帮助读者快速掌握这一实用技能。

weixin_30872337的博客 425

动态规划背包问题之01背包详解

动态规划背包问题之01背包详解

晨的博客 5万+

STM32多模式智能小车状态机设计与中断优先级实践

在嵌入式实时系统中,状态机是实现多任务协同与功能切换的核心范式。其本质是通过有限状态集合、明确转移条件和确定性动作,构建可预测、易维护的控制逻辑。基于STM32等资源受限MCU时,需兼顾状态调度效率、中断并发安全与硬件资源约束。关键技术价值体现在:提升系统模块解耦度、支持物理按键与蓝牙双源触发、保障实时响应不丢帧。典型应用场景包括智能小车多模运行(循迹、避障、遥控、定距跟随等)、工业设备工作模式切换及IoT终端低功耗状态管理。本文以STM32F103C8T6平台为例,深入解析全局模式变量设计、双通道状态切换

weixin_42509888的博客 94

【动态规划 | 01背包】动态规划经典:01背包问题详解

01背包是动态规划的经典问题,要求在容量限制下选择最大价值的物品。本文将详解如何通过状态转移方程高效求解,并给出空间优化方案,帮助掌握这一基础算法模型。

专注于 C/C++ 后端开发,涵盖基础语法、Linux系统与网络、MySQL数据库、常见算法及项目经验。 1444

13、超声断层乳腺图像融合算法:乳腺癌诊断新突破

本文介绍了一种新型超声断层乳腺图像融合算法,通过结合超声透射(UTTc、UTTα)和反射断层图像(URT),实现对乳腺组织的多参数自动可视化。该算法能有效区分良性与恶性肿瘤,具有高准确性、无辐射、低成本等优势,适用于大规模乳腺癌早期筛查。初步临床测试验证了其可行性,未来有望成为乳腺癌诊断的新标准。

9q8w7e6r5的博客 156

【软件系统架构】系列四:嵌入式技术

嵌入式系统是以应用为中心、以计算机技术为基础,并将可配置与可裁剪的软硬件集成于一体的专用计算机系统。它需要满足功能、可靠性、成本、体积、功耗等方面的严格要求。 嵌入式系统一般由以下组成部分构成:

moton2017的博客 1000

01背包问题——动态规划详解

有N件物品和⼀个最多能被重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品只能⽤⼀次,求解将哪些物品装入背包⾥物品价值总和最⼤。 在题目中我们假设有三件物品 重量 价值 物品1 1 15 物品2 3 20 物品3 ...

qq_57205114的博客 2449

嵌入式Zephyr RTOS面试题及参考答案

在Zephyr中,为自定义外设编写Devicetree绑定(Bindings)有助于内核理解设备树中自定义外设节点的含义和属性。首先,需要创建一个.yaml格式的绑定文件,通常存放在目录下对应的子目录中,文件名应能反映外设的类型和功能。绑定文件的开头要定义基本信息,包括字段,用于简要描述外设的功能和用途;compatible字段,它是一个字符串列表,用于匹配设备树中自定义外设节点的compatible属性,设备树节点和绑定文件通过这个字段关联起来。接下来,要定义外设节点的属性。使用properties。

大模型大数据攻城狮的专栏 987

动态规划之01背包问题详解

动态规划之01背包问题详解

yuanxinya_的博客 625

【考研复试】西安电子科技大学上机题

【考研复试】西安电子科技大学上机题

全网粉丝30W+,优快云、稀土掘金人工智能领域签约作者,人工智能、大模型、Python 爬虫,商务合作,请私信沟通。 1740

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

动态规划--01背包问题详解

代码随想录day42和day43 动态规划 模块01背包问题 “即使到不了远方,心中也要有远方的模样。”

weixin_63894681的博客 2603

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

01背包问题详解【动态规划】

01背包: 假设有 n 件物品,至多可装入容积为 m 的容器当中,试问最大可装入的价值为多少? 设w[ i ]为第 i 件物品重量,v[ i ]为第i件物品价值 dp[ i ][ j ]表示将前i件物品装入重量 j 的容器当中 dp方程: 当 i = 0时,dp[ 0 ][ j ]表示把前0件物品装入j大小的容器,总价值为0,所以dp[ 0 ][ j ] = 0 当 j = 0时,dp...

cout0 7250

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

背包问题动态规划matlab,01背包问题动态规划详解

计算机算法分析考试:动态规划0-1背包问题,怎么算她说她没醉,却一直摇摇晃晃掉眼泪;你说你爱她,却从未想过给她一个家。要考试了,老师给划重点有一题:动态规划0-1背包问题,怎么算。 怎么理问题描述: 给定n种物品和一背包,物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品(物品不能你不经意间的嫣然一笑,惊醒了我的时光,点亮了我的世界,从此世界上再无黑暗。01背包问题-动态...

weixin_34026997的博客 1545

详解动态规划01背包问题--JavaScript实现

01动态规划

wulong710的专栏 1944

【转】01背包问题动态规划详解

转载自 sunstar1989 最终编辑 中华复生母 动态规划是用空间换时间的一种方法的抽象。其关键是发现子问题和记录其结果。然后利用这些结果减轻运算量。比如01背包问题。 因为背包最大容量M未知。所以,我们的程序要从1到M一个一个的试。比如,开始任选N件物品的一个。看对应M的背包,能不能放进去,如果能放进去,并且还有多的空间,则,多出来的空间里能放N-1物品中...

weixin_30613343的博客 98

01背包问题详解-动态规划

背包问题:在有限背包容量的情况下选择总价值最大的物品装入背包 用动态规划来解决背包问题,要理解dp[i][j]数组表示的含义:它表示背包可装入体积为j的情况下考虑是否可以装入第i个物品,以及要不要装入第i个物品。dp[i][j] 存的是当前最大总价值。 我的理解是:分两步来考虑,dp[i][j]就是针对第i个物品考虑【能不能】装入和【要不要】装入这两个问题 【能不能】装入就是看当前背包容量 j 是否大于等于第i个物品的体积,如果大于就表示第i个物品可以装入,也就是说,此时背包中可以预留出装入第i个物品的体积

weixin_45789405的博客 183

动态规划-01背包问题通俗详解

本文介绍了01背包问题的动态规划解法。给定背包容量M和N件物品的重量、价值,要求计算能获得的最大总价值。核心思路是使用二维数组dp[i][j]记录前i件物品在容量j时的最大价值。通过状态转移方程进行比较:若当前物品能装入,则比较装入前后的价值;否则保持原值。初始化dp[0][j]=0,最终结果存储在dp[N][M]中。文末给出了完整C++代码示例,并指出该方法通过记忆子问题解避免了重复计算,相比暴力解法更高效。

2403_87013629的博客 409

动态规划---01背包问题详解

动态规划---01背包问题详解 鸣谢:本次的学习是跟着Carl的笔记来的,原创作者为Carl,可以在b站或者公众号关注Carl,搜索代码随想录。 一、01背包问题理论基础 1、问题 ​ 有N件物品和一个最多能背重量为W的背包(也就是说背包的容量是W),第i件物品的重量是weight[i],其价值是value[i],每件物品只能背一次,求解将哪些物品放到背包里面物品价值的总和最大。 2、二维d...

weixin_45807596的博客 355

【算法】动态规划:01背包问题(详解)

一共有 N 件物品,第 i 件物品的体积是 v[i],价值是 c[i] 。 有一个容量为 M 的背包。 在每件物品只能拿一次的前提下,求背包能装入物品的==总价值最大==为多少(并不要求背包装满,只要价值最大就行)? # 基本思路 1. 01背包是动态规划类问题。一般需要将主问题分解为多个子问题,==然后记录下不同子问题的解==,最终才能推得最终问题的答案。 2. 定义子问题:`前i件物品`恰放入一个`容量为v的背包`可以获得的==最大价值==是多少? 3. 我们用 f[i][v] 表示 __前i件物

zzuli-星空 的博客 3442
上一篇: 动态规划的两个经典问题--01背包
下一篇: ECLIPSE快捷键大全
cclsoft
博客等级 码龄19年 39粉丝 113原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值