0-1背包问题 女爷i 2022-08-11 07:30 145阅读 0赞 **问题描述:有N个物品和一个最大可以承受重量为c的背包。每个物品的重量为\{W1,W2,W3,.....,Wn\};** **每个物品的价值为\{p1,p2,....pn\}。现求将哪些物品放入背包中可以获得最大的价值。** **思路:** **假设总共有n个产品,每个物品的重量为m\[i\] (0=<i<=n);** **每个物品的价值为p\[n\] (0=<i<=n);** **m(i,j)表示选择了第i个产品时的价值,j表示背包剩余可以承受的最大重量。** **如果要求解背包中放入哪些产品可以获得最大的价值,** **我们将这个问题看成n步操作,每步操作代表****我们是否将第i(0=<i<=n)个产品放入背包中。** **用f(i, j)表示选择第i个物品时可以获取的最大价值,j表示对应的背包剩余可以承受的最大重量。** **f(i+1, j)表示选择第i+1个物品时的最大可以获取的价值。** **f(i,j)步操作时,要么选择第i个产品,要么不选择第i个产品****。** **当选取了这个产品时,则其价值为f(i+1)+p\[i\],****则背包剩余可以容纳的重量为j-w\[i\];** **如果没有选取这个产品,则其价值和f(i+1)相同,****背包剩余可以容纳的重量不变,仍为j。** **当然,如果第i个产品的重量大于背包剩余可以承受的最大重量时,** **则肯定不能选取这个产品。** **总结来说,**即得到下面的公式: **if(w\[i\] > j)//当w\[i\]大于背包可以容纳的重量时,则必定不选取第i个产品。** **f(i, j) = f(i+1 , j);** **else //否则,f(i,j)为选取和不选取两种情况下的较大值。** **f(i, j) = max( f(i+1, j-w\[i\]) + p\[i\], f(i+1, j))** **这使用递归的思想很好解决,** **代码如下:** #include <stdio.h> #define NUM 6 #define MAX(a,b) (a)>(b)?(a):(b) int w[NUM] = {15,17,20,12,9,14}; int p[NUM] = {32,37,46,26,21,30}; int c = 60;//背包最大的容量。 //id代表第i个元素,left表示背包剩余可以承受的重量。 int pack(int id, int left){ if(id >= NUM) return 0; if(w[id] > left){ return pack(id+1, left); }else{ return MAX(pack(id+1, left-w[id])+p[id], pack(id+1, left)); } } void main(int argc, char **argv) { int max = pack(0, c); printf("max=%d\n",max); } 若使用非递归的方法来解决这个问题,则需要开辟一个空间来记住选择完第i个背包时的最大价值。 具体思路: 开辟一个n\*(c+1)的二维数组m。m\[i\]\[j\]表示选择已经选择了\{0,1,2,..,i-1,i\}个物品,背包的容量为j时, 背包中物品的最大的价值数目。 二维数组的行数为物品的数目,列数为背包最大可以承受的容量+1。 接下来我们用迭代来解决这个问题: 当放入第i个物品的时候,对于背包的每个容量j(0 =< j <= c)而言,其可以装入物品的最大价值为: 如果w\[i\] > j, 则表示第i个物品的重量大于背包的重量,则m\[i\]\[j\]为上一步选取时,背包中物品的最大价值m\[i-1\]\[j\]。 如果w\[i\] < j, 则w\[i\]等于m\[i-1\]\[j-w\[i\]\] + p\[i\] 和m\[i-1\]\[j\]中较大的一个。 所以非递归的代码如下: #include <stdio.h> #include <stdlib.h> #define NUM 6 //0-1背包问题。 void main(int argc, char **argv) { int w[NUM] = {15,17,20,12,9,14};//重量 int p[NUM] = {32,37,46,26,21,30};//效益 int c = 60; int i, j; int m[NUM][61]; //初始化。 memset(m , 0, sizeof(int)*NUM*c); for(i = 0; i < NUM; i++){//对于每个物品,测试它可以放置的最大的重量。 for(j = 0; j <= c; j++){ if(j < w[i]){ if(i >= 1) m[i][j] = m[i-1][j]; }else{ if(i >= 1) <span style="white-space:pre"> </span>m[i][j] = (m[i-1][j]>(m[i-1][j-w[i]]+p[i]))?(m[i-1][j]):(m[i-1][j-w[i]]+p[i]); else m[i][j] = p[i]; } } } printf("max=%d\n",m[NUM-1][c]);//最大的元素放置在m[NUM-1][c]位置上。 }
相关 01背包问题 [0-1背包问题][0-1] Reference: https://www.jianshu.com/p/a66d5ce49df5 问题描述: 0-1背包问题:给定 ﹏ヽ暗。殇╰゛Y/ 2022年10月11日 13:40/ 0 赞/ 258 阅读
相关 01背包问题 1.题目 有N件物品和一个容量为V的背包。第i件物品的成本是c\[i\],价值是w\[i\]。求解将哪些物品装入背包可使价值总和最大,要求是:物品只能放一次。 2.分 系统管理员/ 2022年09月10日 11:27/ 0 赞/ 220 阅读
相关 背包问题-背包01-苹果 package 动态规划.背包01; import java.util.Scanner; public class 苹果 \{ static class 野性酷女/ 2022年07月12日 12:12/ 0 赞/ 259 阅读
相关 01背包问题 ![Center][] ![Center 1][] [Center]: /images/20220616/e1a67e5ed0214bac8ec5293bc2b54 ╰+攻爆jí腚メ/ 2022年06月16日 14:46/ 0 赞/ 238 阅读
相关 01背包问题 public class package0_1 { int V[][] = new int[200][200];//物品选取,背包承重 int max( 约定不等于承诺〃/ 2022年06月08日 06:15/ 0 赞/ 245 阅读
相关 01背包问题 【例9.11】01背包问题 时间限制: 1000 ms 内存限制: 65536 KB 【题目描述】 一个旅行者有一个最多能装M公斤的背包,现在有n件物 淩亂°似流年/ 2022年06月08日 03:59/ 0 赞/ 240 阅读
相关 背包问题—01背包、完全背包 01背包问题 题目 有m件物品和一个容量为V 的背包。放入第i 件物品占用的体积是Vi,得到的价值是Wi。求解将哪些物品装入背包可使价值总和最大。 思路 这 末蓝、/ 2022年05月30日 10:10/ 0 赞/ 369 阅读
相关 01背包问题 简单背包问题 设有一个背包可以放入的物品重量为S,现有n件物品,重量分别是w1,w2,w3,…wn。 问能否从这n件物品中选择若干件放入背包中,使得放入的重量之和正好为S 痛定思痛。/ 2022年05月26日 12:18/ 0 赞/ 237 阅读
相关 01背包问题 转载:[https://blog.csdn.net/xp731574722/article/details/70766804][https_blog.csdn.net_xp73 怼烎@/ 2022年05月06日 15:00/ 0 赞/ 293 阅读
相关 背包问题01 题目 有N件物品和一个容量为V的背包。第i件物品的费用是c\[i\],价值是w\[i\]。求解将哪些物品装入背包可使价值总和最大。 基本思路 这是最基础的背包问题,特 左手的ㄟ右手/ 2022年01月29日 11:34/ 0 赞/ 329 阅读
还没有评论,来说两句吧...