算法——动态规划之0-1背包问题

程序员通勤双肩包,下单送全年 CSDN 会员 防泼水面料电脑包,保护笔记本电脑,背负轻便,下单再赠 Coding Plan,看技术干货、查文档、下载源码,一站式搞定学习需求 阅读详情

打算每天复习一点算法内容,就先从动态规划下手。曾经动态规划让我头疼,重新学了一下觉得还好啦不是很难,实现动态规划算法的核心在于实现它的递推公式,写出递推公式,代码也就很容易了。

 

动态规划类似分治法,都是将一个大问题分解为一个个小问题,分而治之。不同之处在于,动态规划记忆了重复的子问题,避免了运算过程中的重复计算。

适用情况:有重叠子问题和最优子结构性质(动态规划每一步求的都是最优解)的问题。

下面我们通过经典的动态规划问题(0-1背包问题)来学习这个算法。

问题描述:将N件物品选几件放入容量为W(重量)的背包中,每件物品有自己的重量w和价值v,要求在不超过背包容量情况下使背包内放入的物品总价值最高。

分析:①不超过背包容量,有:Σw[i]<=W (i表示第i件物品)

          ②对于“将前i件物品放入容量为j的背包中”这个子问题,现只考虑第i件物品放还是不放,如果放了的话,问题转换为“前i-1件物品放入剩下j-w[i]容量的背包中”,如果不放,问题转换为“前i-1件物品放入容量为j的背包中”。这两种情况的优者为当前问题的最优解。

          ③根据②的分析,得到如下递推公式

            

                其中,0<=i<=N,0<=j&l

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

相关推荐

算法设计与分析 0-1背包问题 动态规划解法【超详细】

0-1背包问题 问题描述 给定i个物品和一个容量为的背包,物品的重量是Wi,其价值为Vi 物品个数为i,背包容量为C。 如何选择装入背包内的物品,使得装入背包中的物品的总价值最大? 其中,每种物品只有全部装入背包或不装入背包两种选择。 物品不能分割,不能重复使用。 动态规划算法思路 首先建立一个数组B[i][c],最上面一行表示背包容量,最左边一列表示物品编号,中间填充的数值表示当当前背包容量为C...

寒泉 4万+

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

下面我用容积代表重量(我是不会承认我看走眼了的。又懒得改。)0-1背包问题动态规划背包问题系列的最基础的一个问题。相对理解起来较为简单。按书上来说,要证明一个问题是否可以使用动态规划思想,需要满足最优子结构的性质,那么什么是最优子结构的性质呢?书上给出的定义如下图看起来很拗口,其实就是不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略。说白了就是一个最优策略的子策略也是必须是最优的,而所有子问题的局部最优解将导致整个问题的全局最优。

菜鸟的博客 1万+

0-1背包问题(Knapsack Problem)-动态规划方法(C语言递归和迭代)

背包问题 C语言递归 C语言迭代 动态规划方法

Jasonchen1224的博客 7662

动态规划算法01背包问题(思路及算法实现)

说明:算法源自教材。本文相当于对教材做的一个笔记(动态规划与贪心算法01背包必须先对背包按照单位重量的价格从大到小排序,否则拆分的子问题就不具备最优子结构的性质) 动态规划算法动态规划就是一个填表的过程。该表记录了已解决的子问题的答案。求解下一个子问题时会用到上一个子问题的答案。{比如01背包问题:假如有1个背包,背包容量是10,有5个物品,编号为1,2,3,4,5,他们都有各自的...

远行的博客 8万+

0019算法笔记——【动态规划0-1背包问题

1、问题描述:      给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问:应如何选择装入背包的物品,使得装入背包中物品的总价值最大?      形式化描述:给定c >0, wi >0, vi >0 , 1≤i≤n.要求找一n元向量(x1,x2,…,xn,), xi∈{0,1}, ∋ ∑ wi xi≤c,且∑ vi xi达最大.即一个特殊的整数规划问题。

liufeng_king的专栏 6万+

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

待续。。。 代码实现 package com.zzb.algorithm.dynamic; /** * 动态规划算法 * 应用实例:0-1背包问题(限制每个物品要么拿(1个),要么不拿(0个)) */ public class KnapsackProblem { public static void main(String[] args) { // 每个物品的重量 ...

花开归矣的博客 8024

0-1背包问题、贪心算法动态规划

0-1背包问题

松狮 2万+

动态规划/贪心算法----0/1背包问题AND普通背包问题

 两个背包问题都是比较典型的问题,对这两种算法的理解有很好的帮助.0/1背包问题--问题描述:设U = {u1,u2,u3,......ui}(一共有amount数量的物品)是一组准备放入背包中的物品.设背包的容量为size.定义每个物品都具有两个属性weight和value.我们要解决的问题就是计算在所选取的物品总重量不超过背包容量size的前提下使所选的物品总价值最大.

Simon_Ghost的专栏 9250

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

0-1背包问题动态规划算法 问题: 给定一组多个([公式])物品,每种物品都有自己的重量([公式])和价值([公式]),在限定的总重量/总容量([公式])内,选择其中若干个(也即每种物品可以选0个或1个),设计选择方案使得物品的总价值最高。 可以演变: 疫情期间,各大药店对口罩限购,现在一药店有六种口罩,A:2元一包(两个个),B:2元一包(三个),C:3元一包(一个),D:1元一包(五个),E:五元一包(四个),F:2元一包(三个)。现在每一种口罩最多只允许购买一包,带n元过去,最多可以买多少个口

li123_123_的博客 1365

0-1背包问题动态规划算法java实现

1 算法实现 import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayList; import java.util.Scanner; public class Demo { // 记录背包的总容量 public int packageweight; // 记录商品总数 publi...

连正的博客 5869

算法实验2:0-1背包问题动态规划算法实现

0-1背包问题动态规划算法实现 一、实验目的和要求: 1.掌握动态规划算法思想。 2.掌握最优子结构原理。 3.了解动态规划一般问题,并利用动态规划解决0-1背包问题。 二、实验环境: VS2019 – .cpp文件 三、算法描述及实验步骤 1.问题描述: 给定n个物品和一个背包。物品i的重量为wi,价值为vi,背包容量为c。 如何选择装入背包中的物品,使得装入背包的物品的价值最大? 注:每种物品i只有两种选择,装入或者不装入,既不能装入多次,也不能只装入一部分。 2.问题形式化描述: 给定

你说的白是什么白_ 2918

0-1背包问题动态规划算法实现(C语言)

编译环境:Dev-C++ 动态规划求解0-1背包问题的具体算法实现。

m0_57443189的博客 5074

动态规划法求解0-1背包问题2(改进算法

动态规划法求解0-1背包问题2(改进算法) #include <iostream> #include <algorithm> using namespace std; int p[1000][1000];//p存放跳跃点集合,第一列存放物品的质量w,第二列存放物品的价值v int x[5]= {0},head[100];//head是指向各个阶段跳跃点集合的开始 int W...

weixin_44996854的博客 1216

算法分析与设计实验报告——0-1背包问题动态规划算法实现

算法分析与设计实验报告——0-1背包问题动态规划算法实现 目录:算法分析与设计实验报告——0-1背包问题动态规划算法实现一、 实验目的二、实验要求三、 实验原理四、 实验过程(步骤)五、 运行结果六、实验分析与讨论七、实验特色与心得附件一 实验过程(步骤)附件二 运行结果 一、 实验目的 掌握动态规划的基本思想和解决问题的基本步骤,认识动态规划和分治法的联系与区别,对比解决同一问题的两种算法设计策略的时间复杂性。 二、实验要求 用c++语言实现用动态规划算法解决0-1背包问题,分析时间复杂性,体会动态

千色千寻的博客 2万+

动态规划算法以及0/1背包问题Java实现

动态规划算法一、基本概念二、算法步骤及问题举例三、动态规划解决0/1背包问题代码实现 一、基本概念 动态规划算法的核心思想是:将大问题划分为小问题进行解决,从而一步一步获得最优解的处理算法动态规划算法与分治算法类似,其基本思想也是将代求问题分解成若干子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 与分治算法不同的是,适合于动态规划求解的问题,经分解得到的子问题往往不是互相独立的,即下一个子阶段的求解过程是建立在上一个子阶段的解的基础上,进行进一步的求解。 二、算法步骤及问题举例 我们以一

猪奥奥的Blog 1359

动态规划算法实现0/1背包问题

动态规划算法实现0/1背包问题 思路分析: weight[i]表示第i个物品的重量 value[i]表示第i个物品的价值 target表示背包目标的容量 要求的问题是在不超过背包目标容量的前提下的最大价值 使用一个二维数组v[i][j]表示在不超过j的质量下使用i及之前的物品装入背包 所创造的最大价值 话不多说 直接上代码 公式在代码中有体现 以及如何输出装入的背包物品 希望大家可以理解 package suanfa.dynamic; /** * 0/1背包问题 使用动态规划的..

qq_42013013的博客 683

动态规划0-1背包问题。(算法设计与分析详解)

背包问题通俗的说,就是假如你面前有5块金块速分别为a, b, c, d, e,每块金块的重量不同,并且每块金块所带来的价值也不同(注意:这里金块的重量的价值没有特定关系),目前我们有一个背包,只有固定的容量,要解决的问题就是在一定容量的背包面前装哪几块金块才能获取到最大的价值,对于每块金块我们只有拿或者不拿这两种选择,拿为1不拿为0,因此叫做0-1背包问题。下面我们给出思想,以及步骤。

q805370101的博客 5783

算法】利用动态规划实现0-1背包问题

描述 给定一个物品集合s={1,2,3,…,n},物品i的重量是wi,其价值是vi,背包的容量为W,即最大载重量不超过W。在限定的总重量W内,我们如何选择物品,才能使得物品的总价值最大。 分析 如果物品不能被分割,即物品i要么整个地选取,要么不选取; 不能将物品i装入背包多次,也不能只装入部分物品i,则该问题称为01背包问题。 如果物品可以拆分,则问题称为背包问题,适合使用贪心算法。 建立计...

SuperSources的博客 2457
上一篇: javascript——对于js中全等判断和相等判断特殊情况的整理
下一篇: 算法——动态规划之资源分配问题及其优化
Astar_小白的成长之路
博客等级 码龄10年 53粉丝 63原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值