问题描述

有n个重量分别为{w1,w2,…,wn}的物品,它们的价值分别为{v1,v2,…,vn},给定一个容量为W的背包。
设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么不选中,要求选中的物品不仅能够放到背包中,而且重量和为W具有最大的价值。

问题求解

对于可行的背包装载方案,背包中物品的总重量不能超过背包的容量。
最优方案是指所装入的物品价值最高,即 v1x1+v2x2+…+vn*xn(其中xi取0或1,取1表示选取物品i)取得最大值。
在该问题中需要确定x1、x2、…、xn的值。假设按i=1,2,…,n的次序来确定xi的值,对应n次决策即n个阶段。
设置二维动态规划数组dp,dp[i][r]表示背包剩余容量为r(1≤r≤W),已考虑物品1、2、…、i(1≤i≤n)时背包装入物品的最优价值。显然对应的状态转移方程如下:
dp[i][0]=0(背包不能装入任何物品,总价值为0)
边界条件dp[i][0]=0(1≤i≤n)―边界条件
dp[0][r]=0(没有任何物品可装入,总价值为0)
边界条件dp[0][r]=0(1≤r≤W)―边界条件
dp[i][r]=dp[i-1][r] 当r<w[i]时,物品i放不下
dp[i][r]= MAX{dp[i-1][r],dp[i-1][r-w[i]]+v[i]}
否则在不放入和放入物品i之间选最优解
这样, dp[n][W]便是0/1背包问题的最优解。
当dp数组计算出来后,推导出解向量x的过程十分简单,从dp[n][W]开始:
(1)若dp[i][r]≠dp[i-1][r],若dp[i][r]=dp[i-1][r-w[i]]+v[i],置x[i]=1,累计总价值maxv+=v[i],递减剩余重量r=r-w[i]。
(2)若dp[i][r]=dp[i-1][r],表示物品i放不下或者不放入物品i,置x[i]=0。

代码

int n = 5, W = 10;
int w[MAXN] = { 0,2,2,6,5,4 };
int v[MAXN] = { 0,6,3,5,4,6 };
int dp[MAXN][MAXN];
int x[MAXN];
int maxv;
void Knap()
{int i, r;for (i = 0; i <= n; i++)dp[i][0] = 0;for (r = 0; r <= W; r++)dp[0][r] = 0;for (i = 1; i <= n; i++){for (r = 1; r <= W; r++){if (r < w[i])dp[i][r] = dp[i - 1][r];elsedp[i][r] = max(dp[i - 1][r], dp[i - 1][r - w[i] + v[i]]);}}
}
void Bulidx()
{int i = n, r = W;maxv = 0;while (i >= 0){if (dp[i][r] != dp[i - 1][r]){x[i] = 1;maxv += v[i];r = r - w[i];}elsex[i] = 0;i--;}
}

算法分析

Knap()算法中含有两重for循环,所以时间复杂度为O(n×W),空间复杂度为O(n×W)。

动态规划法求解0/1背包问题相关推荐

  1. 分枝限界法求解0/1背包问题

    问题描述 有n个重量分别为{w1,w2,-,wn}的物品,它们的价值分别为{v1,v2,-,vn},给定一个容量为W的背包. 设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么不选中 ...

  2. 用滚动数组求解0/1背包问题

    用滚动数组求解0/1背包问题(此处仅求装入背包的最大价值) // 由于第i个阶段(考虑物品i)的解dp[i][ * ]只与第i-1个阶段(考虑物品i-1)的解dp[i-1][ * ]有关,这种情况下保 ...

  3. C语言动态规划法解决0/1背包问题(详细解答)

    动态规划法解决0/1背包问题(详细解答) 首先让我们回顾一下动态规划法的使用规则: 一..动态规划法的实现思路: 1.划分子问题:将元问题分解为若干个子问题,每一个子问题对应一个决策,并且子问题之间具 ...

  4. 回溯法 —— 求解0/1背包问题(剪枝)

    0/1背包问题 题目描述: 有n个重量分别为w1,w2,-,wn的物品(物品编号为1~n),它们的价值分别为v1,v2,-,vn,给定一个容量为W的背包.设计从这些物品中选取一部分物品放入该背包的方案 ...

  5. 【武汉理工大学计算机复试刷题】(C语言)动态规划求解0/1背包问题之求最大价值

    文章目录 题目描述 思路分析 代码 运行情况 输入文件 运行结果 发现的问题 题目描述 一个旅行者有一个最多能装M公斤的背包,现在有n件物品,它们的重星分别是W1,W2, - Wn,它们的价值分别为C ...

  6. 动态规划算法据序偶原理求解0/1背包问题(C++实现)

    可程序根据序偶原理,应用动态规划算法求解. Code   1//说明:本程序有一定代码冗余,若分割为多个函数的形式会使程序简洁明了.   2#include <iostream>   3u ...

  7. 0/1背包问题---C++动态规划法

    [问题] 给定n种物品和一个背包,物品i(1≤i≤n)的重量是,其价值为,背包容量为,对于每种物品只有两种选择:装入背包或者不装入背包.如何选择装入背包的物品,使得装入背包中物品的总价值最大? [想法 ...

  8. 算法设计与分析实验二:动态规划法实现TSP问题和0/1背包问题

    [实验目的] 1.熟练掌握动态规划思想及教材中相关经典算法. 2.使用动态规划法编程,求解0/1背包问题和TSP问题. TSP问题 一.实验内容: TSP问题是指旅行家要旅行n个城市,要求每个城市经历 ...

  9. 0/1背包问题-----回溯法求解

    问题描述 有n个物品和一个容量为c的背包,从n个物品中选取装包的物品.物品i的重量为w[i],价值为p[i].一个可行的背包装载是指,装包的物品总重量不超过背包的重量.一个最佳背包装载是指,物品总价值 ...

最新文章

  1. vbs脚本在服务器上虚拟按键,iisvdir.vbs iis虚拟目录管理脚本使用介绍
  2. RK 利用SARADC 来做多个按键
  3. java分页代码思路,记录--java 分页 思路 (hibernate关键代码)
  4. store.js - 轻松实现本地存储(LocalStorage)
  5. Oracle ERP Interface堵住--Request Running too long time,查找Request执行的Sql
  6. el-table的使用总结
  7. 批量word删除页眉页脚——VBS脚本,在office宏中运行即可
  8. 利用U盘引导进入pe系统修复操作系统
  9. Spring(三) 表单页面处理
  10. 一文了解无线网桥-小白笔记
  11. 彪悍的人生,不需要解释!
  12. 手机用html电视,手机怎么连接电视
  13. AdaBoost.M1算法
  14. 苹果造车简史:库克能靠造车封神吗?
  15. Zemax基础知识7--衍射知识(一)
  16. 表单域修饰符numebr、trim、lazy
  17. 电脑派位系统(新生入学摇号) v2016
  18. 程序员实用工作技能之Docker
  19. C#汽车租凭(面对对象(封装、继承,多态的应用))
  20. 金蝶EAS补丁安装目录

热门文章

  1. 【已解决】VMware Vmware提示以独占方式锁定此配置文件失败 虚拟机开机黑屏
  2. 在Tricore上移植μC/OS-III——2.4 CSA的存储和调用
  3. 边打dota边学java 第一篇
  4. 有趣的心理测试,引发的一系列故事……
  5. java 集成 protobuf及二次压缩
  6. 整理的微表情数据库资源 可直接下载到本地电脑 SAMM+SMIC+CASME1+CASME2+CASME^2+CASME3
  7. 自然语言处理算法整理
  8. Go参考TcMalloc内存分配
  9. ACM Fellow 郭宗杰:36年培养160余位博士,3/4反哺工业界!
  10. 匀速直线运动的模糊图像的盲复原的复现