01背包算法的理解

01背包问题:

有N件物品和一个最大重量限制为V的背包。第i件物品的重量是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的重量总和不超过V,且价值总和最大。每个物品只有1份,且不可分割

看了01背包算法,言简意赅,但理解起来头昏脑胀,不得要领。尝试解释下对该算法的理解,加深记忆。

假设最优解已经存在,怎么判断一个物品i是否在背包里?  简单,只要知道,

1、c[i]是否大于V,

2、F[i-1][V-c[i]],即没有i物品的情况下,最大重量限制为V-c[i]的最优解。

3、F[i-1][V],即没有i物品的情况下,最大重量限制为V的最优解。

如果F[i-1][V-c[i]]+w[i]>F[i-1][V],那最优解就包含i。问题转到了求没有i物品的N-1件物品,最大重量为V和V-c[i]的两个背包的最优解。递归下去最终会求只有1件物品、0件物品的最优解。只有k(k=0、1、2。。N)件物品的时候,需要求最大重量为多少的背包的最优解?不知道,但可以从最大重量0到V的背包都求最优解。

这样,要求N件物品,最大重量限制为V的背包的最优解,那就先求有0个物品,0--V个背包的最优解(0个物品时任何背包的最优解都是0,最大重量限制为0的背包,不管多少个物品的最优解也是0),然后顺序计算只有前1、2…..N个物品的最优解,F[k][V]=max{ F[k-1][V-c[k]]+w[k] ,F[k-1][v]}。这样,就得到F[N][V]的最优解了。

时间: 2024-10-18 21:34:57

01背包算法的理解的相关文章

用coffee和socket.io实现的01背包算法

先说说我为什么写这些吧 当程序猿太苦逼了,真的,时间久了,真没有搬砖的成就感高,好歹人家能盖栋楼(身材也能练得不错),咱们指不定哪天来个熊孩子把硬盘格了就啥也没了. 这学期明显没把心放在前端上--汗啊,将来还想吃着口饭呢,但是这学期绝对没休息,只是忙了很多可能很多人认为无聊的事. 因为这学期无聊事太多了,耽误了很多,也让导师很失望,自己也很自卑,整理一下调调心态. 因为很多是针对作业的奇葩想法,所以,作业嘛,不糊弄就不是作业了,还希望大家多多批评. 兴许因为哪篇文章能解决工作呢. 我想试试Mar

01背包算法

转:01背包问题 动态规划的基本思想: 将一个问题分解为子问题递归求解,且将中间结果保存以避免重复计算.通常用来求最优解,且最优解的局部也是最优的.求解过程产生多个决策序列,下一步总是依赖上一步的结果,自底向上的求解. 动态规划算法可分解成从先到后的4个步骤: 1. 描述一个最优解的结构,寻找子问题,对问题进行划分. 2. 定义状态.往往将和子问题相关的各个变量的一组取值定义为一个状态.某个状态的值就是这个子问题的解(若有k个变量,一般用K维的数组存储各个状态下的解,并可根    据这个数组记录

0-1背包的动态规划算法,部分背包的贪心算法和DP算法------算法导论

一.问题描述 0-1背包问题,部分背包问题.分别实现0-1背包的DP算法,部分背包的贪心算法和DP算法. 二.算法原理 (1)0-1背包的DP算法 0-1背包问题:有n件物品和一个容量为W的背包.第i件物品的重量是w[i],价值是v[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大.其中每种物品只有一件,可以选择放或者不放. 最优子结构性质:对于0-1问题,考虑重量至多W的最值钱的一包东西.如果去掉其中一个物品j,余下的必是除j以外的n-1件物品中,可以带走的重量

01背包之理解

01背包(ZeroOnePack): 有N件物品和一个容量为V的背包.(每种物品均只有一件)第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大. 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放. 用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值.则其状态转移方程便是: f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]} 把这个过程理解下:在前i件物品放进容量v的背包时,

【算法学习笔记】30.动态规划 01背包和完全背包的关系

首先先说明一下01背包和完全背包问题的区别 01背包:有 N 件物品和一个容量为 V 的背包.放入第 i 件物品耗费的费用是 Ci,得到的价值是 Wi.求解将哪些物品装入背包可使价值总和最大.(可以不装满) 完全背包:有 N 种物品和一个容量为 V 的背包,每种物品都有无限件可用.放入第 i 种物品 的费用是 Ci,价值是 Wi.求解:将哪些物品装入背包,可使这些物品的耗费的费用总和不超过背包容量,且价值总和最大. 先说结论: 两个问题的最优解都要用DP来解决,实现的过程也非常像只是在内层循环中

java实现背包算法(0-1背包问题)

0-1背包的问题 背包问题(Knapsack problem)是一种组合优化的NP完全问题.问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高.问题的名称来源于如何选择最合适的物品放置于给定背包中. 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放. 用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值.则其状态转移方程便是: f[i][v]=max{ f[i-1][v], f

有关货币问题的动态规划题目--有关01背包,完全背包,多重背包

背包dp:参考背包九讲以及给出一些题目 01背包 (先枚举物品,再逆序枚举容量) 给定n件物品和一个容量为V的背包,每件物品的体积是w[i],价值是va[i](1<=i<=n),求在不超过背包的容量的情况下,怎么选择装这些物品使得得到的价值最大? 例如:有5件物品,体积分别是{2,2,6,5,4},价值分别是{6,3,5,4,6} 递归式:F(i,v)=max(F(i-1,v), F(i-1,v-w[i])+va[i]),其中F(i,v)表示把前i种物品恰放入背包容量为v时取得的最大价值 把这

01背包和动态规划

做了一段时间NOI,做到动态规划看了几天算法书籍.还是没有深入,学了基本的动态规划,稍有一点体会,记录到这里. 背包是这样一类问题:在限定总质量前提下,从若干质量\价格对中,取哪些能使得价格最大. 动态规划是一种思想,简单的说,动态规划思想就是充分利用对子问题的计算结果来递推父问题结果.所以,动态规划具有较高的效率,省去了一些不必要的计算.这里主要关心表和递推关系,其实这两者是同一个东西,根据记录表来推得父问题的解,找到递推关系要依赖表记录子问题的解.不同的问题有不同的构建方式,所以我个人觉得,

01背包与物品无限背包

一.01背包问题 01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为C1,C2,…,Cn,与之相对应的价值为W1,W2,…,Wn.求解将那些物品装入背包可使总价值最大. 动态规划: 1) 子问题定义:F[i][j]表示前i件物品中选取若干件物品放入剩余空间为j的背包中所能得到的最大价值. 2) 根据第i件物品放或不放进行决策 其中F[i-1][j]表示前i-1件物品中选取若干件物品放入剩余空间为j的背包中所能得到的最大价值: 而F[i-1][j-C[i]]+W[i]表示前i-1