生活随笔
收集整理的這篇文章主要介紹了
蛮力法/01背包问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
- 所有解:結合增量蠻力法 求解冪集的方法,先求出所有物品的組合
- 可行解:遍歷所有的物品求物品和體積<=背包容量的物品組合
- 最優解:找出體積和最大的物品組合
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背包问题的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。