背包问题的动态规划解法
来源:互联网 发布:log4j2 java代码加载 编辑:程序博客网 时间:2024/05/27 21:49
01背包问题具体例子:假设现有容量10kg的背包,另外有3个物品,分别为a1,a2,a3。物品a1重量为3kg,价值为4;物品a2重量为4kg,价值为5;物品a3重量为5kg,价值为6。将哪些物品放入背包可使得背包中的总价值最大?
这个问题有两种解法,动态规划和贪婪算法。本文主要讨论动态规划的方法。动态规划问题的最主要也是最关键的步骤在于寻找状态转移方程。
先将原始问题一般化,欲求背包能够获得的总价值,即欲求前i个物体放入容量为m(kg)背包的最大价值c[i][m]——使用一个数组来存储最大价值,当m取10,i取3时,即原始问题了。而前i个物体放入容量为m(kg)的背包,又可以转化成前(i-1)个物体放入背包的问题。下面使用数学表达式描述它们两者之间的具体关系。
表达式中各个符号的具体含义。
w[i] : 第i个物体的重量;
p[i] : 第i个物体的价值;
c[i][m] : 前i个物体放入容量为m的背包的最大价值;
c[i-1][m] : 前i-1个物体放入容量为m的背包的最大价值;
c[i-1][m-w[i]] : 前i-1个物体放入容量为m-w[i]的背包的最大价值;
由此可得:
c[i][m]=max{c[i-1][m-w[i]]+pi , c[i-1][m]}(下图将给出更具体的解释)
根据上式,对物体个数及背包重量进行递推,列出一个表格(见下表),表格来自互联网,当逐步推出表中每个值的大小,那个最大价值就求出来了。推导过程中,注意一点,最好逐行而非逐列开始推导,先从编号为1的那一行,推出所有c[1][m]的值,再推编号为2的那行c[2][m]的大小。这样便于理解。
思路厘清后,开始编程序,C语言代码如下所示。
#include <stdio.h>int c[10][100]={0};void knap(int m,int n){ int i,j,w[10],p[10]; for(j=0;j<m+1;j++) for(i=0;i<n+1;i++) { if(j<w[i]) { c[i][j]=c[i-1][j]; continue; }else if(c[i-1][j-w[i]]+p[i]>c[i-1][j]) c[i][j]=c[i-1][j-w[i]]+p[i]; else c[i][j]=c[i-1][j]; } }
0 0
- 背包问题的动态规划解法
- 01背包问题的动态规划解法
- 0-1背包问题的动态规划解法
- 0-1背包问题的动态规划解法
- 0-1背包问题的动态规划解法
- 01背包问题 动态规划解法
- 0-1背包问题--动态规划解法
- 0-1背包问题动态规划解法
- 【转】 01背包问题 动态规划解法
- 0-1背包的动态规划解法
- 0-1背包问题的动态规划解法为什么是NPC问题?
- 为什么0-1背包问题是NP完全问题,但该问题还有动态规划的解法?
- java--0-1背包问题--动态规划解法
- 动态规划的背包问题
- 0-1背包问题及其动态规划求解之二——王晓东的书本解法
- 0-1背包问题的两种解法(回溯法和动态规划)
- 01背包的动态规划解法(史无前例的详细)
- 合唱队问题的动态规划解法
- How to conditionally apply CSS styles in AngularJS?
- Windows服务编写综述
- RabbitMQ的使用与分析
- 我开通过博客了,不过不是新浪博客
- Javascript定时器(一)——单线程
- 背包问题的动态规划解法
- Android 利用addView 动态给Activity添加View组件
- Spring MVC避免IE提示下载返回的JSON 数据——解决办法
- APP Store审核
- hdu 1040 As Easy As A+B (水题)
- wamp 修改默认的www路径
- 你必须精致
- 来这打个转
- iphone 6适配