01背包 暴力解法

01背包问题正如其名,其本质就是真和假,0和1。每个物品只有要么被装进背包,要么没有装进背包这两种状态。其暴力解法也算是一种全排列问题。

如上图所示,我们可以用一个数组used来表示这五个物品当前的状态。{0,0,0,0,0}该数组就表示这五个物品都没有被选中。{1,0,0,0,0}表示只有第一个物品被选中了。

第一步 找到所有的可能性

便是找到所有的可能性,其总数为 C0 5+ C1 5+ C2 5+ C3 5+ C4 5+ C5 5 = 25 = 32 。也就是找出其全排列。
具体解题细节我写在注释里了

/*** 计算全排列![在这里插入图片描述](https://img-blog.csdnimg.cn/20201104173601395.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MDc5MTU3,size_16,color_FFFFFF,t_70#pic_center)* @param res 存储所有的全排列(所有的可能性)* @param path 存储一条可能性* @param depth 目前递归的深度* @param len 总深度*/
public static void giveBack(List<List<Integer>> res, Deque<Integer> path, int depth, int len){if (depth>=len){ //递归终止的条件res.add(new ArrayList<>(path));// new ArrayList<>(path)  === path.clone() 相当于创建了一个path的副本。具体原因在下面说明。return;}path.add(0); //压进path;giveBack(res,path,depth+1,len);path.removeLast();//在递归完之后,从path中弹出,恢复为上一个状态。path.add(1);//压进path;giveBack(res,path,depth+1,len);path.removeLast();//在递归完之后,从path中弹出,恢复为上一个状态。return;}

new ArrayList<>(path) === path.clone() 相当于创建了一个path的副本。

如果使用res.add(path),path是一个引用数据类型的变量它指向了一个对象空间,res.add(path)这条语句执行之后并没有把path中的值存入res中,而是把path指向的对象空间的地址给了res。也就是说当所有的递归执行完毕之后,res数组中的所有元素全部都指向了path指向的对象空间,这就表示res数组中的值是一样的。path的最终值为{1,1,1,1,1},所以res数组中全部的元素值都是{1,1,1,1,1},

所以要用new ArrayList<>(path) 或path.clone(),创建一个副本,断开与path主体的联系。

第二步 计算所有的可能性

计算所有可能性的重量和价值,并且通过循环和判断找到满足条件的最优解。

具体解题细节我写在注释里了

public static void main(String[] args) {/*len是物品的总数,c是背包的容量,res 存储所有的全排列(所有的可能性)path 存储一条可能性depth 目前递归的深度*/int len = 5, c = 15;  //len是物品的总数,c是背包的容量int[] weight = {12,2,1,4,1};int[] value = {4,2,1,10,2};List<List<Integer>> res = new ArrayList<>();Deque<Integer> path = new ArrayDeque<>();giveBack(res,path,0,len);List<Integer> temp;  //临时变量,提高效率int sumWeight = 0, // 存储一条可能性的重量和价值sumValue = 0,maxValue = 0, //存储目前找到的满足条件的最大价值。maxIndex = 0;//存储目前最大价值对应的那一条可能性的下标。for (int i = 0; i < res.size(); i++) {temp = res.get(i); //得到res中的一条数据System.out.print(temp);System.out.print("      ");for (int j = 0; j < len; j++) {//计算价值和重量if (temp.get(j) == 1){sumValue += value[j];sumWeight += weight[j];}}System.out.print("重量 :"+sumWeight);System.out.print("      ");System.out.print("价值 :"+sumValue);System.out.print("      ");if (sumWeight > c){  //大于容量就超重System.out.print("超重");System.out.print("      ");}else { //小于容量,就判断一下是不是最大价值if (sumValue>maxValue){ //是,就更新相关信息maxValue = sumValue;maxIndex = i;}System.out.print("可行");System.out.print("      ");}System.out.println();sumWeight = 0;sumValue = 0;}//通过最大价值可能性的下标maxIndex,找到该条记录。System.out.println("最大价值的可行方案" + res.get(maxIndex));}

算法实验 01背包 暴力解法 java实现相关推荐

  1. 【算法】01背包及其优化详解

    [01背包] 一.问题描述: 在NNN个物品,背包容量为CCC的情况下,每个物品的价值为viv_ivi​,重量为wiw_iwi​,每个物品选择装入背包(1)或者选择不装入背包(0).然后选择物品装入背 ...

  2. 01背包python解法_0-1背包问题及Python代码实现

    1.简介 假设我们有n件物品,分别编号为1, 2...n.其中编号为i的物品价值为vi,它的重量为wi.为了简化问题,假定价值和重量都是整数值.现在,假设我们有一个背包,它能够承载的重量是W.现在,我 ...

  3. 蓝桥杯 ADV-144 算法提高 01背包

    问题描述 给定N个物品,每个物品有一个重量W和一个价值V.你有一个能装M重量的背包.问怎么装使得所装价值最大.每个物品只有一个. 输入格式 输入的第一行包含两个整数n, m,分别表示物品的个数和背包能 ...

  4. 蓝桥杯 ADV-144算法提高 01背包

    问题描述 给定N个物品,每个物品有一个重量W和一个价值V.你有一个能装M重量的背包.问怎么装使得所装价值最大.每个物品只有一个. 输入格式 输入的第一行包含两个整数n, m,分别表示物品的个数和背包能 ...

  5. java背包算法回溯法_【算法分析】实验 4. 回溯法求解0-1背包等问题

    [TOC] 实验内容 本实验要求基于算法设计与分析的一般过程(即待求解问题的描述.算法设计.算法描述.算法正确性证明.算法分析.算法实现与测试),通过回溯法的在实际问题求解实践中,加深理解其基本原理和 ...

  6. Java入门算法(动态规划篇2:01背包精讲)

    本专栏已参加蓄力计划,感谢读者支持❤ 往期文章 一. Java入门算法(贪心篇)丨蓄力计划 二. Java入门算法(暴力篇)丨蓄力计划 三. Java入门算法(排序篇)丨蓄力计划 四. Java入门算 ...

  7. 贪心算法 0-1背包c语言,贪心算法0-1背包问题(算法实验代码).pdf

    . 实验三. 0-1 背包问题(贪心算法) 实验代码: #include int max(int a,int b) { if(a>b) return a; else return b; } vo ...

  8. java多重背包算法,01背包、完全背包和多重背包

    最优化原理 指的最优策略具有这样的性质:不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略. 如何证明一个最优策略的子策略也是最优解,一般使用反证法来证明. 无后效性 ...

  9. Java 01背包【动态规划·蓝桥杯练习题】(相信杨超越,相信锦鲤,默默努力,其它的看天意)

    锦鲤镇楼 1.题目描述: 时间限制:1.0s 内存限制:256.0MB 关键字:01背包 动态规划 问题描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高 ...

最新文章

  1. [译]Chipmunk 教程2 - 基本概念
  2. Teradata天睿公司推出适用各种部署环境的全球最强分析数据库
  3. [css] 判断如下边框的颜色,并解释为什么[代码]?
  4. meta http-equiv=X-UA-Compatible content=IE=edge / 的说明
  5. 计算机网络太难?如何系统自学计算机网络?
  6. 对于employees表中,给出奇数行的first_name
  7. 安装Oracle 11g RAC R2 之Linux DNS 配置
  8. 七夕烟花c语言程序,C语言七夕必备神器,待那烟花灿烂时,依旧做个单身狗
  9. 地图比例尺与空间分辨率之间的关系_卫星遥感制图最佳影像空间分辨率与地图比例尺关系探讨...
  10. 网易云精选评论,总有一句戳在你心里
  11. 介绍两种游标cursor与sys_refcursor
  12. 制作名片设计需要哪些要素
  13. Python运算符优先级与结合性
  14. ClickHouse入门到精通
  15. 解析Linux中的系统安全及应用(二)
  16. 黑板课爬虫闯关第一关
  17. Unity3d 周分享(14期 2019.4.1 )
  18. 歌曲版本识别或者歌曲检索(总结)
  19. 18 余数相同问题 c语言,2018年国考行测备考之简单两招教你搞定余数问题
  20. 连接数据库报Java::ComMysqlCjJdbcExceptions::CommunicationsException: Communications link failure

热门文章

  1. 2017陕西省网络空间安全技术大赛_Crypto_crypt1_Writeup
  2. MOSFET, MOS管, 开关管笔记
  3. Linux 基础知识总结
  4. 计算机配置8c16g,腾讯云服务器价格表(1核2G/2核4G/4核8G/8核16G配置)
  5. android 监听 短信,Android短信验证码监听解决onChange多次调用的方法
  6. 梅西凑齐七个金球成功召唤神龙
  7. 计算机应用文写作C,计算机应用和公文写作
  8. 胡适致毕业生:功不唐捐
  9. hive中的UDF 自定义函数 : 如何创建临时/永久函数
  10. 群晖download station中添加BT搜索引擎