**

01背包问题 动态规划

**

1.动态规划

什么是动态规划?动态规划就是将一个大问题不断向下拆分成小问题,直到拆分出的小问题可以求出其解,然后将小问题的解不断的向上合并,最终得到大问题的解决方案。
  
2.01背包问题

一个旅行者有一个最多能装m公斤的背包,现在有n中物品,每件的重量分别是W1、W2、……、Wn,每件物品的价值分别为C1、C2、……、Cn, 需要将物品放入背包中,要怎么样放才能保证背包中物品的总价值最大?
  
3.简单思路

1.01背包问题与背包问题的区别在于,01背包,物品的选择只有两种一种是拿,另一种是不拿,而背包问题在于,物品可以只取一部分。所以01背包问题不能用贪心算法解决。
2.以dp[i][j]表示用i种物品,重量为j表示所取得的价值。
3.对于第i种物品,如果第i种物品重量大于j,就证明第i种物品肯定不能取,这时的dp[i][j]=dp[i-1][j]
4.如果第i种物品重量小于j,那就会出现两种情况,采用i的话,物品价值dp[i][j]=采用前面的i-1种物品,所占用的重量为j-i.getweight,所产生的价值+第i 种物品的价值。如果不采用i,价值为dp[i-1][j]。换成数学表达式就是dp[i][j]=Math.max(dp[i-1][j-weight]+value,dp[i-1][j]);
5.比如当i=5,j=10时,dp[5][10]就代表了所取得的最大价值。到这里我们就完成了任务的一半,接下为我们要寻找到底哪些物品放入了背包,从前面的表达式我们可以发现,当dp[i][j]=dp[i-1][j-weight]时,这时为i的物品就会放入背包,所以我们从结果,开始往回走,遇到这种情况,就说明有物品放入背包,然后物品数减1,重量减去为i的重量,继续,最后就能求出哪 些物品放入背包了。

例题:

1.题目描述:

有如下5种物品,小明的书包最多只能装下8公斤的物品,小明特别贪心,思考怎么选择使自己书包能装下并且得到的价值最大。

物品1:6公斤   价值48元
物品2:1公斤    价值7元
物品3:5公斤    价值40元
物品4:2公斤    价值12元
物品5:1公斤    价值8元

2.解题思路:

其实我们正常思维,一般会想,我要尽量装满8公斤,把最大的价值求出来,可是这样的话,就需要用到递归,递归能解出来,只是算法难度高。但是什么是动态规划,动态规划就是逆着来,我要求装8公斤的物品怎么装使得价值最大。我可以先考虑装0公斤,最大价值,再考虑装1公斤最大价值,考虑装2公斤最大价值,装3公斤最大价值,把前面都记录下来。用另外一个temp[i][j]数组记录下来。i呢表示我现在出现的物品的数量,当i循环到最后一个数量的时候就结束了嘛。自己想象一下,我虽然有5件物品,先只给你一件,你判断能不能装下,能装下,那么你就看你装下这件物品,和不装下这件物品哪个价值高,那么记录下来即可。具体填下下面的表试下,真正会填表就差不多了

      0  1  2  3  4  5   6    7    80  0  0  0  0  0   0    0    0
6 48  0  0  0  0  0  0   48  48   48
1 7   0  7  7  7  7  7   48  55   55
5 40  0  7  7  7  7  40  48  55   55
2 12  0  7  12 19 19 40  48  55   60
1 8   0  8  15 20 27 40  48  56   63

这个表是怎么来的呢?,举个例子,当我横着一排一排填,因为最开始只掉一件物品,开始掉重量是6的物品,到6的时候就能装下了,所以temp[1][6]=48,另外7,8也只有这一件物品填。所以还是一样的。

接下来掉第二个物品,掉下1这个物品了,1的价值是7,也就是temp[2][1] = 7。后面一直到temp[2][5]都是等于7。 重点重点来了,到了temp[2][6]的时候怎么办呢?我们的当然一看就是,我要选第一件物品,它的价值是48,可是选了第一件物品,背包就满了,就不能装第二件重量为1的物品了,所以temp[2][6] = 48。

我们人可以这样思考,关键就来了,关键就是怎么让计算机也可以这样思考呢,我们就需要用代码。其实仔细想想,我掉第二件物品了,判断如果不能装下,那么temp[2][j] = temp[2][j-1] //记住j表示的是我背包现在最大只能装j这么多,那既然这个物品装不下,那么当然不能装了。如果我当前物品重量小于j,那么我就可以选择是装还是不装呢?只要比较装还是不装哪个价值大就行了。如果不装的话价值这个时候的最大价值是不会变的,因为都不装嘛,也就是,temp[2][j] = temp[2-1][j] 。如果我装的话,关键是这个,还是到刚才的到第二件物品的价值为6的时候考虑,如果我装下重量1这个物品,temp[2][6] = temp[2-1][6 - 这个物品的重量] + 物品的价值 //

其实我 temp[2-1][6-这个物品重量]表示我还没装这个物品之前的价值腾出装这个物品的空间,然后加上这个物品的价值进行比较。关键是之前的每一个状态都用数组给记录下来了。关键代码先看一下,结合代码再理解

for(int i=1;i<6;i++) {for(int j=1;j<9;j++) {if(w[i]<=j) {temp[i][j] = Math.max(temp[i-1][j], temp[i-1][j-w[i]]+v[i]); //其实就是比较物品选还是不选哪种价值大。}else {temp[i][j] = temp[i-1][j];//第i件物品不能放}}
}

3.代码示例


import java.util.Scanner;public class knapsack {static int[] w = new int[6];//每件物品的重量static int[] v = new int[6];//每件物品的价值public static void solution(){int[][] temp = new int[6][9];//8表示背包最多能放8公斤的重量for(int j = 0;j < 9;j++){//初始化每一行temp[0][j] = 0;}for(int i = 1;i < 6;i++){//背包重量为0时,最大价值肯定是0temp[i][0] = 0;}for(int i = 1;i < 6;i++){//从第一个物品开始选,记录我选了前面出现的物品,背包重量从1-8的能选上的最大值for(int j = 1;j < 9;j++){//当i循环到最后一层5的时候,也就是得到了,我5件物品都选上的时候的最大值if(w[i] <= j){//重量比这个状态小,那么就能放。就是放与不放的问题,观察室放重量大还是不放重量大temp[i][j] = Math.max(temp[i-1][j], temp[i-1][j-w[i]]+v[i]);}else{temp[i][j] = temp[i-1][j];//第i件物品不能放}}}for(int i = 0;i < 6;i++){for(int j = 0;j < 9;j++){System.out.print(temp[i][j] + " ");}System.out.println();}}public static void main(String[] args) {System.out.println("请依次输入重量和价值:");Scanner scn = new Scanner(System.in);for (int i = 0; i < 6; i++) {w[i] = scn.nextInt();//输入重量v[i] = scn.nextInt();//输入价值}solution();}
}

01背包问题 动态规划 java实现 简单通俗易懂相关推荐

  1. 01背包问题 动态规划 java(详细注释)

    public class Knapsack {// 0/1背包算法,填表x,f,找最大价值public static void knapSack(int c, int n, int x[], int ...

  2. 01背包问题动态规划(二维数组)

    01背包问题动态规划(二维数组) 问题描述 ​ 一个旅行者有一个最多能装 M 公斤的背包,现在有 n 件物品,它们的重量分别是W1,W2,-,Wn,它们的价值分别为C1,C2,-,Cn,求旅行者能获得 ...

  3. 0-1背包问题动态规划模型的Python解法

    0-1背包问题动态规划模型的Python解法 1.01背包问题 2.Python解决方案 3.01背包问题例题 1.01背包问题 背包问题(Knapsack problem)是一种组合优化的NP完全问 ...

  4. 背包问题动态规划matlab,01背包问题动态规划详解

    计算机算法分析考试:动态规划0-1背包问题,怎么算她说她没醉,却一直摇摇晃晃掉眼泪:你说你爱她,却从未想过给她一个家. 要考试了,老师给划重点有一题:动态规划0-1背包问题,怎么算. 怎么理问题描述: ...

  5. 0-1背包问题 动态规划java_C#使用动态规划解决0-1背包问题实例分析

    // 利用动态规划解决0-1背包问题 using System; using System.Collections.Generic; using System.Linq; using System.T ...

  6. 算法设计与分析 0-1背包问题 动态规划解法【超详细】

    0-1背包问题 问题描述 给定i个物品和一个容量为的背包,物品的重量是Wi,其价值为Vi 物品个数为i,背包容量为C. 如何选择装入背包内的物品,使得装入背包中的物品的总价值最大? 其中,每种物品只有 ...

  7. 01背包问题—动态规划求解

    动态规划 01 背包问题 关键代码 for (int i = 1; i <= n; ++i){for (int j = 0; j <= c; ++j){if (j < w[i]) / ...

  8. 【转】01背包问题动态规划详解

    转载自 sunstar1989 最终编辑 中华复生母 动态规划是用空间换时间的一种方法的抽象.其关键是发现子问题和记录其结果.然后利用这些结果减轻运算量. 比如01背包问题. 因为背包最大容量M未知. ...

  9. 01背包问题 动态规划求解方法 动态方程的详细解释 能理解的解释(附python代码)

    01背包问题属于组合优化问题:假设你要出门旅游,你现在有一个书包,这个书包的容量(capacity)有限,有很多物品如牙刷.防晒霜.雨伞.水杯等等,但书包装不下所有物品,因此我们必须有所取舍.那么通常 ...

最新文章

  1. Linux环境高级编程函数,Linux环境高级编程--出错处理(CLStatus)
  2. 深度聚类的可视化解释
  3. 选择之后触_发宜常梳:4种材质的梳子,我们最常用的梳子却对头发最不好,该如何选择?...
  4. 1708硬盘转接口_ICY DOCK全球首款U.2转USB转接器震撼上市
  5. Elasticsearch 并发修改乐观锁
  6. Vue生命周期学习总结
  7. 双人游戏根据胜负关系匹配
  8. 计算机数据结构模拟试题,十套计算机数据结构试题及答案.doc
  9. 活动报名场地预约自定义表单小程序开发
  10. 完美数Python解法
  11. 用vue-cli搭建vue项目
  12. python中mod函数_Python pandas.DataFrame.mod函数方法的使用
  13. 量化——【01】你不得不知道的金融量化基础知识
  14. 【无2022年聚合工艺考试模拟100题模拟考试平台操作
  15. 技术在游戏研发中的重要性
  16. Virtualbox主机和虚拟机之间文件夹共享及双向拷贝
  17. Codeforces 712E Memory and Casinos
  18. matlab 总谐波失真,分析谐波失真 - MATLAB Simulink Example - MathWorks 中国
  19. 公司局域网服务器设置不连外网 仅内网访问用设置
  20. 无法定位程序输入点_invalid_parameter_noinfo_noreturn于动态链接库 MSVCR100.dll上

热门文章

  1. php 实现curl下载,如何利用phpcurl实现多进程下载文件类
  2. 酷我音乐盒和千千静听
  3. 国内8大热门android论坛
  4. Android Studio 最新汉化包下载及安装方法,持续更新 IDEA
  5. T检验与F检验的区别和关系
  6. 脸萌创始人郭列:准备好做一颗流星
  7. VNX中的DataMover
  8. 学机器人编程课以后有用吗
  9. SpringReport--报表设计器的使用
  10. 【数字逻辑】如何根据真值表的内容写出对应的逻辑关系式?