动态规划(一):0-1背包问题
目录
- 前言
- 一、原理
- 1.1 最优子结构性质
- 1.2 递归关系
- 二、算法描述
- 2.1 算法描述
- 2.2 图解
- 2.3 构造最优解
- 三、0−10-10−1 背包问题相关题目
- 3.1 题目
- 3.2 源程序(Java求解0−10-10−1背包问题)
- 3.3 运行结果
- 总结
- 源码下载
前言
给定 nnn 种物品和一个背包。物品 iii 的重量是 wiwiwi,其价值为 vivivi,背包的容量为 ccc。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大?
一、原理
0−0 -0−111 背包问题是一个特殊的整数规划问题。
maxmaxmax ∑i−1nvixi{\textstyle \sum_{i-1}^{n}} v_{i} x_{i}∑i−1nvixi
{∑i=1nwixi≤Cxi∈(0,1),1≤i≤n\begin{cases}{\textstyle \sum_{i=1}^{n}} w_{i} x_{i} \le C \\ x_{i} \in (0,1),1\le i \le n \end{cases}{∑i=1nwixi≤Cxi∈(0,1),1≤i≤n
1.1 最优子结构性质
maxmaxmax ∑i=2nvixi{\textstyle \sum_{i=2}^{n}} v_{i} x_{i}∑i=2nvixi
{∑i=2nwixi≤C−w1y1xi∈(0,1),2≤i≤n\begin{cases}{\textstyle \sum_{i=2}^{n}} w_{i} x_{i} \le C-w_{1}y_{1} \\ x_{i} \in (0,1),2\le i \le n \end{cases}{∑i=2nwixi≤C−w1y1xi∈(0,1),2≤i≤n
1.2 递归关系
maxmaxmax ∑k=invkxk{\textstyle \sum_{k=i}^{n}} v_{k} x_{k}∑k=invkxk
{∑k=inwkxk≤jxk∈(0,1),i≤k≤n\begin{cases}{\textstyle \sum_{k=i}^{n}} w_{k} x_{k} \le j \\ x_{k} \in (0,1),i\le k \le n \end{cases}{∑k=inwkxk≤jxk∈(0,1),i≤k≤n
设所给 0−10-10−1 背包问题的子问题的最优值为 m(i,j),即 m(i,j)是背包容量为 j,可选择物品为 i,i+1,…,n 时 0-1背包问题的最优值。由 0-1背包问题的最优子结构性质,可以建立计算 m(i,j)的递归式如下:
二、算法描述
2.1 算法描述
伪代码:
2.2 图解
2.3 构造最优解
三、0−10-10−1 背包问题相关题目
3.1 题目
已知有5个物体,它们的重量分别为:2,2,4,5,4,各物体的价值依次为6,3,5,4,6,背包大小为10,使用动态规划法求矩阵m[i][j],并给出最优解。
修改数据为:5个物体,它们的重量分别为:1,1,2,3,2,各物体的价值依次为6,3,5,4,6,背包大小为6,使用动态规划法求矩阵m[i][j],并给出最优解
3.2 源程序(Java求解0−10-10−1背包问题)
/*** 0-1背包问题(动态规划法求解)*/
public class E3_9 {//物品的个数+1(第一个数我写成0)static int N = 6;//static int C = 7;static int C = 11;/*** 程序的入口* @param args*/public static void main(String[] args) {//int n = N-1;//背包的容量int c = C-1;int i;//物体的重量//int w[] = new int[N];int w[] = new int[]{0,2,2,4,5,4};//int w[] = new int[]{0,1,1,2,3,2};//物体的价值//int v[] = new int[N];int v[] = new int[]{0,6,3,5,4,6};//动态规划法求解过程的矩阵int m[][] = new int[N][C];//选择的结果int x[] = new int [N];/*for (i = 1; i < N; i++) {w[i] = 1+(int) (Math.random()*5);v[i] = 1+(int) (Math.random()*10);}*/knapsack(v,w,c,m);traceback(m,w,c,x);System.out.printf("背包能装的最大价值为:"+"%d \n ",m[1][c]);for (i = 1; i <= c; i++) {System.out.printf("%2d \t",i);}System.out.printf("重量 价值\n");for (i = 1; i < N; i++) {System.out.printf("%d:",i);for (int j = 1; j <= c; j++) {System.out.printf("%2d \t",m[i][j]);}System.out.printf("%2d%4d\n",w[i],v[i]);}System.out.printf("\n\n物品的重量");for (i = 1; i < N; i++) {System.out.printf("%2d \t",w[i]);}System.out.printf("\n物品的价值");for (i = 1; i < N; i++) {System.out.printf("%2d \t",v[i]);}System.out.printf("\n选择的结果");for (i = 1; i < N; i++) {System.out.printf("%2d \t",x[i]);}System.out.printf("\n");}/*** 由0-1背包问题的最优子结构性质建立的递归式* @param v 存储物品价值的数组* @param w 存储物品重量的数组* @param c 背包容量* @param m 动态规划法求解过程的矩阵*/public static void knapsack(int []v,int []w,int c,int [][]m){int n=v.length-1;int jMax=Math.min(w[n]-1,c);for(int j=0;j<=jMax;j++) m[n][j]=0;for(int j=w[n];j<=c;j++) m[n][j]=v[n];for(int i=n-1;i>0;i--){jMax=Math.min(w[i]-1,c);for(int j=0;j<=jMax;j++)m[i][j]=m[i+1][j];for(int j=w[i];j<=c;j++)m[i][j]=Math.max(m[i+1][j],m[i+1][j-w[i]]+v[i]);}//m[1][c]=m[2][c];//对于i=1时的两种情况if(c>=w[1])m[1][c]=Math.max(m[2][c],m[2][c-w[1]]+v[1]);elsem[1][c]=m[2][c];}/*** 构造最优解* @param m 动态规划法求解过程的矩阵* @param w 存储物体的重量的数组* @param c 背包容量* @param x 存储选择结果的数组*/public static void traceback(int [][]m,int []w,int c,int []x){int n=w.length-1;for(int i=1;i<n;i++)if(m[i][c]==m[i+1][c])x[i]=0;else {x[i]=1;c-=w[i];}x[n]=(m[n][c]>0)?1:0;}
}
3.3 运行结果
总结
动态规划基本步骤
- 找出最优解的性质,并刻划其结构特征。
- 递归地定义最优值。
- 以自底向上的方式计算出最优值。
- 根据计算最优值时得到的信息,构造最优解。
源码下载
欢迎各位前来下载!
如有错误和不足之处,欢迎大家指出,我会修正和更新文章内容!
动态规划(一):0-1背包问题相关推荐
- 【动态规划】0/1背包问题
问题 H: [动态规划]0/1背包问题 时间限制: 1 Sec 内存限制: 64 MB 提交: 152 解决: 95 [提交] [状态] [讨论版] [命题人:admin] 题目描述 张琪曼和李旭 ...
- 动态规划之0/1背包问题(动态规划入门)
动态规划很早以前就接触过但是因为太晦涩难懂一下子到现在才开始真正的学习到其中的道理,0/1背包问题是动态规划的入门类问题 比较好理解 首先我们要知道动态规划是用于解决最优解的问题 它是一种思想而不是一 ...
- 【武汉理工大学计算机复试刷题】(C语言)动态规划求解0/1背包问题之求最大价值
文章目录 题目描述 思路分析 代码 运行情况 输入文件 运行结果 发现的问题 题目描述 一个旅行者有一个最多能装M公斤的背包,现在有n件物品,它们的重星分别是W1,W2, - Wn,它们的价值分别为C ...
- 0/1背包问题——动态规划方法
1.定义 动态规划:把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解. 2.求解步骤 (1)找到状态转化条件 (2)归纳状态转移方程 (3)定义初始条件值 3.实例解析--0/1背包 ...
- 动态规划——0/1背包问题(全网最细+图文解析)
✨动态规划--0/1背包问题(全网最细+图文解析) 作者介绍:
- 0/1背包问题——动态规划、回溯、分支限界法对比
0/1背包问题--动态规划.回溯.分支限界法对比 2017.12.19 20:42:02 字数 3713 阅读 2820 目录 1.问题描述 1.1 问题描述 1.2 问题的数学表示(规划类问题,此种 ...
- 0/1背包问题-----动态规划求解
问题描述 有n个物品和一个容量为c的背包,从n个物品中选取装包的物品.物品i的重量为w[i],价值为p[i].一个可行的背包装载是指,装包的物品总重量不超过背包的重量.一个最佳背包装载是指,物品总价值 ...
- 动态规划的用法——01背包问题
动态规划的用法--01背包问题 问题主题:著名的01背包问题 问题描述: 有n个重量和价值分别为wi.vi的物品,现在要从这些物品中选出总重量不超过W的物品,求所有挑选方案中的价值最大值. 限制条件: ...
- 动态规划——物品无限的背包问题
动态规划--物品无限的背包问题 物品无限的背包问题.有nn种物品,每种均有无穷多个.第i种物品的体积为ViV_i,重量为WiW_i.选一些物品装到一个容量为CC的背包中,使得背包内物品在总体积不超过C ...
- 令人头疼的背包九讲(1)0/1背包问题
点击上方"Jerry的算法和NLP",选择"星标"公众号 重磅干货,第一时间送达 背包问题是一个经典的动态规划模型.它既简单形象容易理解,又在某种程 ...
最新文章
- android音频调制通讯,android音频口通信(一)——2FSK信号调制
- 网页调用摄像头_【WebAR】虚拟现实来到网页——WebXR Device API第二部分
- 0/1背包问题-----回溯法求解
- postgresq dur_DUR的完整形式是什么?
- 《操作系统》OS学习(十):进程控制
- 18-ESP8266 SDK开发基础入门篇--TCP 服务器 RTOS版,串口透传,TCP客户端控制LED
- Spark精华问答 | 为什么选择Spark作为流计算引擎?
- WPF实现TextBox水印效果
- JPA EntityManager –HibernateEntityManager
- 解决Weblogic与Hibernate的jar冲突
- mysql分组取每组前几条记录_[转] mysql分组取每组前几条记要(排名)
- JS - javascript容错处理代码
- visio用例图箭头怎么画_visio2010绘制用例图-带图例
- java 语音库_语音控制pc
- PB12下geturl获取汉字乱码的解决
- shell常见的语句结构_wuli大世界_新浪博客
- 鸡啄米VS2010/MFC教程
- 【随笔】编程能力和程序员
- 3269: 万水千山粽是情
- Laya Air+Unity3D双引擎带你做个天空球3D小游戏(下篇)