• 所有解:结合增量蛮力法 求解幂集的方法,先求出所有物品的组合
  • 可行解:遍历所有的物品求物品和体积<=背包容量的物品组合
  • 最优解:找出体积和最大的物品组合
package xcrj.kchalgorithm.bruteForce;import java.util.*;/*** 问题:* 有n个物品 重量分别为{w1,w2,…,wn},价值分别为{v1,v2,…,vn}* 背包能够承受的重量为w* 选取一部分物品放入该背包* 每个物品要么选中要么不选中* 要求选中的物品不仅能够放到背包中,而且具有最大的价值* <p>* 所有解:结合增量蛮力法 求解幂集的方法,先求出所有物品的组合* 可行解:遍历所有的物品求物品和体积<=背包容量的物品组合* 最优解:找出体积和最大的物品组合* <p>* 技巧:编号代替*/
public class Knapsack01 {static class Goods {private int weight;private int value;public Goods() {}public Goods(int weight, int value) {this.weight = weight;this.value = value;}public int getWeight() {return weight;}public void setWeight(int weight) {this.weight = weight;}public int getValue() {return value;}public void setValue(int value) {this.value = value;}}/*** 可行解** @param allResult       所有解* @param availableWeight 背包能承受的最大重量* @param weights         物品重量* @param values          物品价值*/public static Set<Set<Integer>> feasibleResults(Set<Set<Integer>> allResult, int availableWeight, int[] weights, int[] values) {Set<Set<Integer>> feasibleWeightResult = new HashSet<>(8);Set<Integer> optimalValueResult = null;int optimalValue = 0;for (Set<Integer> set : allResult) {int weightSum = 0;for (Integer code : set) {weightSum += weights[code - 1];}// 可以放进背包的物品if (weightSum <= availableWeight) {Set<Integer> feasibleSet = new HashSet<>(4);for (Integer code : set) {feasibleSet.add(code);}feasibleWeightResult.add(feasibleSet);// 可以放进背包的物品价值int sumValue = 0;for (Integer code : set) {sumValue += values[code - 1];}// 最大价值if (sumValue > optimalValue) {optimalValue = sumValue;optimalValueResult = new HashSet<>(4);for (Integer code : set) {optimalValueResult.add(code);}}}}System.out.println("所有可行解:");System.out.println(feasibleWeightResult);System.out.println("最优解:");System.out.println(optimalValueResult);return feasibleWeightResult;}/*** 所有解** @param n 物品数量*/public static Set<Set<Integer>> allResults(int n) {Set<Set<Integer>> setSet = new HashSet<>(8);// {} 空集Set<Integer> setNull = new HashSet<>();setSet.add(setNull);for (int j = 0; j < n; j++) {Set<Set<Integer>> setSet2 = new HashSet<>(8);// 保存原来的集合for (Set<Integer> set : setSet) {Set<Integer> set2 = new HashSet<>();for (Integer v : set) {set2.add(v);}setSet2.add(set2);}// 给原集合中的每个幂集增加jfor (Set<Integer> set : setSet) {set.add(j + 1);}// 将set2中的幂集放到set中,组合成新的集合for (Set<Integer> set : setSet2) {setSet.add(set);}}return setSet;}public static void main(String[] args) {// 4个物品,能承受6公斤重量的背包// 数组下标+1是物品的唯一编号int[] weights = {5, 3, 2, 1};int[] valuess = {4, 4, 3, 1};Set<Set<Integer>> allResult = allResults(4);feasibleResults(allResult, 6, weights, valuess);}
}

蛮力法/01背包问题相关推荐

  1. 【算法】回溯法——0-1背包问题

    [fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 回溯法        回溯法是一种非常有效的方法,有"通用的解题法"之称 ...

  2. python 回溯法 01背包问题_回溯法-01背包问题

    一.问题描述 给定 n 件物品,物品的重量为 w[i],物品的价值为 c[i].现挑选物品放入背包中,假定背包能承受的最大重量为 V,问应该如何选择装入背包中的物品,使得装入背包中物品的总价值最大 二 ...

  3. python 回溯法 01背包问题_回溯法解决01背包问题

    回溯法是一个既带有系统性又带有跳跃性的搜索算法. 它在包含问题的所有解的解空间树中按照 深度优先的策略, 从根节点出发搜索解空间树. 算法搜索至解空间树的任一节点时, 总是先判断 该节点是否肯定不包含 ...

  4. python 回溯法 01背包问题_Python回溯法解决01背包问题

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  5. java蛮力法背包问题_[算法课]五种蛮力法解决01背包问题

    文章目录 注明:题目要求只能使用蛮力法 算法标签:全排列,枚举,二进制,dfs,数组 题目简介 思路 AC代码 方法一:字符串蛮力 方法二:二进制枚举 方法三:DFS 三.2闫老板思考角度 方法四:全 ...

  6. 回溯法解01背包问题(最通俗易懂,附C++代码)

    问题描述: 01背包问题是算法中的经典问题,问题描述如下: 对于给定的N个物品,第i个物品的重量为Wi,价值为Vi,对于一个最多能装重量C的背包,应该如何选择放入包中的物品,使得包中物品的总价值最大? ...

  7. python 回溯法 子集树模板 系列 —— 3、0-1背包问题

    问题 给定N个物品和一个背包.物品i的重量是Wi,其价值位Vi ,背包的容量为C.问应该如何选择装入背包的物品,使得放入背包的物品的总价值为最大? 分析 显然,放入背包的物品,是N个物品的所有子集的其 ...

  8. C++~回溯+贪心法解决01背包问题

    C++~回溯+贪心法解决01背包问题 参考文章: (1)C++~回溯+贪心法解决01背包问题 (2)https://www.cnblogs.com/rimochiko/p/8168638.html 备 ...

  9. 重写0-1背包问题的回溯法,使算法能输出最优解

    重写0-1背包问题的回溯法,使算法能输出最优解 样例: 4 7 3 9 5 10 2 7 1 4 输出: 20 分析:构建二叉树,每个物品只有拿和不拿两种情况, 时间复杂度为O(2^n). 不难, 深 ...

  10. python回溯方法的模板_Python基于回溯法子集树模板解决0-1背包问题实例

    本文实例讲述了Python基于回溯法子集树模板解决0-1背包问题.分享给大家供大家参考,具体如下: 问题 给定N个物品和一个背包.物品i的重量是Wi,其价值位Vi ,背包的容量为C.问应该如何选择装入 ...

最新文章

  1. 主瓣、栅瓣和旁瓣的定义
  2. 使用NPOI操作Excel
  3. 机器学习算法与Python实践之(二)支持向量机(SVM)初
  4. 快速排序算法_基于位运算的快速排序算法
  5. extjs chart无法在panel中显示_手绘风格的 JS 图表库:Chart.xkcd
  6. linux6.5dns装什么,1、RHEL6.5下DNS服务器的安装及简单应用(一)
  7. 汇编语言笔记(三): 标志寄存器
  8. 信息学奥赛一本通(1044:判断是否为两位数)
  9. C#并行编程-并发集合
  10. 5 年 Python 的我,总结了这 90 条写 Python 程序的建议
  11. java避免空指针异常
  12. iOS常用的存储方式介绍
  13. Intel 64 and IA-32 Architectures Instruction Format 指令格式
  14. post and get
  15. 适合win7的python版本_Python 3.9 发布,不再支持 Win7!
  16. css页面载入动画,纯css创建网页加载动画
  17. 用计算机进行废物回收,回收旧的显示器以进行废物利用
  18. html5 生成条码,Html5添加Canvas的EAN13条形码生成插件教程
  19. jsp text 水印_java实现图片上加文字水印(SpringMVC + Jsp)
  20. Postman批量运行

热门文章

  1. 崩坏3新版本服务器维护多久,崩坏3V3.5版本10月17日版本更新维护通知
  2. Tarena代码-一些代码碎片
  3. 一摞python风格的纸牌(fluent python阅读)
  4. linux给音乐添加封面,linux系统获取MP3的专辑封面图片
  5. matlab极性电容叫什么,有极性电容和无极性电容原理区别
  6. 开贝修图最新版 免狗全功能版
  7. CStyle足迹:一个BIOS人的成长日记之开篇
  8. [动态规划]最长公共子序列
  9. URL的作用是什么?它由几部分组成?
  10. ios 手写键盘闪退问题 UIKBBlurredKeyView candidateList