动态规划的01背包问题,来自背包九讲上的一段:-------------------------------------------------------------------------------------------------------有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i

来源:学生作业帮助网 编辑:作业帮 时间:2024/04/26 04:56:27
动态规划的01背包问题,来自背包九讲上的一段:-------------------------------------------------------------------------------------------------------有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i

动态规划的01背包问题,来自背包九讲上的一段:-------------------------------------------------------------------------------------------------------有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i
动态规划的01背包问题,
来自背包九讲上的一段:
-------------------------------------------------------------------------------------------------------
有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的背包中”这个子问题,若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i-1件物品的问题.如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”,价值为f[i-1][v];如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-c[i]的背包中”,此时能获得的最大价值就是f[i-1][v-c[i]]再加上通过放入第i件物品获得的价值w[i].
---------------------------------------------------------------------------------------------------------
优化空间复杂度
以上方法的时间和空间复杂度均为O(N*V),其中时间复杂度基本已经不能再优化了,但空间复杂度却可以优化到O(V).
先考虑上面讲的基本思路如何实现,肯定是有一个主循环i=1..N,每次算出来二维数组f[i][0..V]的所有值.那么,如果只用一个数组f[0..V],能不能保证第i次循环结束后f[v]中表示的就是我们定义的状态f[i][v]呢?f[i][v]是由f[i-1][v]和f[i-1][v-c[i]]两个子问题递推而来,能否保证在推f[i][v]时(也即在第i次主循环中推f[v]时)能够得到f[i-1][v]和f[i-1][v-c[i]]的值呢?事实上,这要求在每次主循环中我们以v=V..0的顺序推f[v],这样才能保证推f[v]时f[v-c[i]]保存的是状态f[i-1][v-c[i]]的值.伪代码如下:
for i=1..N
for v=V..0
f[v]=max{f[v],f[v-c[i]]+w[i]};
其中的f[v]=max{f[v],f[v-c[i]]}一句恰就相当于我们的转移方程f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]},因为现在的f[v-c[i]]就相当于原来的f[i-1][v-c[i]].
----------------------------------------------------------------------------------------------------------
基本思路我都明白,但是优化空间复杂度由O(N*V)变成O(V)的时候我不明白,为什么v要从V下降到0?现在的f[v]和原来的f[i][v]是什么关系?谁能解释下优化后的伪代码?

动态规划的01背包问题,来自背包九讲上的一段:-------------------------------------------------------------------------------------------------------有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i
注意到原来每次f[i][v]只用了一次,所以现在f[v]相当于原来的f[v],
上次循环保存的f[v]相当于原来的f[i-1][v]
如果从0做到V的话,没有重复限制,会从v->v+c[i]->v+2*c[i]加上去,本次循环的c[i]也会加上

动态规划的01背包问题,来自背包九讲上的一段:-------------------------------------------------------------------------------------------------------有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i 详细解析动态规划与0-1背包问题,怎么理解,要易懂的,我将感激不尽! 求动态规划0/1背包问题的经典习题及测试数据 0-1背包问题的多种解法代码(动态规划、贪心法、回溯法、分支限界法) 动态规划(不是0-1背包,每件物品可装入0次或多次)网上都是0-1背包,这是升级版的背包问题,每件物品可不装或装入多次 动态规划,0-1背包问题在背包问题九讲中p01 01背包中有这样一段话:一个常数优化前面的伪代码中有 for v=V..1,可以将这个循环的下限进行改进.由于只需要最后f[v]的值,倒推前一个物品,其实只 动态规划 0/1背包问题(续) 求思路 怎么判断有没有装满【动态规划】0/1背包问题(续)Time Limit:1000MS Memory Limit:65536KTotal Submit:119 Accepted:43 Description给定n种物品和一背包.物品i的重量是w[i],其价 背包问题的算法登上算法、递归算法、贪婪算法、动态规划算法利用matlab编程实现我把我仅有的分都给了 经典的0-1背包用动态规划解,加上什么条件之后,会变得不能用动态规划?举个例子,我有用经典0-1背包问题,满足无后效性和最优子结构性质.加上什么条件可以消除无后效性或者消除最优子结构 急,用动态规划解0-1背包算法 双肩背包的英语 背包要什么样的? 背包的英文是什么 孔夫子的背包一( ) 孔子的背包下一句 dp动态规划中的背包问题01背包问题有几步处理并不太明白,(1)f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}转化为f[v]=max{f[v],f[v-c[i]]+w[i]} 时,为什么0...v的顺序要变成逆顺序 v...0(2)注意f[i][v]有意义当 动态规划的0-1背包问题,请高手解释下代码算法如下:void Knapsack(Type v,int w,int c,int n,Type * * m){int jMax=min(w[n]-1,c);for(int j=0;j 动态规划 多人背包问题Description DD 和好朋友们要去爬山啦!他们一共有 K 个人,每个人都会背一个包.这些包的容量是相同的,都是 V.可以装进背包里的一共有 N 种物品,每种物品都有给定的体积