package com.link;
/**
* @Author sunzy
* @DATE Create in 2019/10/16 14:36
*/
public class page01 {
//背包总承载量
public static int maxvalue=300;
//每个物品的重量
public static int[] goods={5,13,22,14,56,33,14,17,34,22,13,14,11,6,22};
//每个物品的价值
public static int[] costs={12,9,22,34,4,6,13,16,45,33,67,23,1,7,8};
//标志物品是否放入背包0 未放入 1放入
public static int[] values={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
//最优解的物品放入情况
public static int[] bestvalues={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
public static int bestValue=-1;
//当前已放入背包的价值
public static int currentValue=0;
//当前已放入背包的重量
public static int totallight=0;
public static void main(String[] args) {
searchBest(0);
printBestGood();
printBestCost();
}
private static void printBestCost() {
for(int i=0;i< bestvalues.length;i++){
if(bestvalues[i]==1){
System.out.print(costs[i]+",");
}
}
System.out.println("");
}
private static void printBestGood() {
for(int i=0;i< bestvalues.length;i++){
if(bestvalues[i]==1){
System.out.print(goods[i]+",");
}
}
System.out.println("");
}
private static void searchBest(int i) {
//所有物品分配完毕,打印价值及所需的值
if(i>14){
if(currentValue>bestValue){
bestValue=currentValue;
for(int j=0;j<values.length;j++){
bestvalues[j]=values[j];
}
}
}else{
for(int j=0;j<=1;j++){
values[i]=j;
if(j==0){
searchBest(i+1);
}
else {
//总重量超过限制值,减枝
if(totallight+goods[i]<=maxvalue){
currentValue=currentValue+costs[i];
totallight=totallight+goods[i];
searchBest(i+1);
currentValue=currentValue-costs[i];
totallight=totallight-goods[i];
}
}
}
}
}
}
0-1 背包回溯算法实现java 版
最新推荐文章于 2021-09-15 20:24:41 发布