0-1背包问题

来源:互联网 发布:知乎 感情 精华贴 编辑:程序博客网 时间:2024/06/06 18:39
import java.util.ArrayList;
import java.util.Scanner;


import org.omg.CORBA.PUBLIC_MEMBER;




public class Knapsack {
   private int weight;
   private int value;
   public Knapsack(int weight,int value){
  this.weight=weight;
  this.value = value;
   }
   public int getWeight() {
 return weight;
   }
   public int getValue(){
  return value;
   }


   public String toString() {
  return "[weight=" + weight + ", value=" + value + "]";
   } 
}


class KnapsackProblem{
private Knapsack[] bags;
private int totalweight;
private int n;
private int[][] bestValues;
private int bestValue;
private ArrayList<Knapsack> bestSolution;


public KnapsackProblem(Knapsack[]bags,int totalweight){
this.bags=bags;
this.totalweight=totalweight;
this.n=bags.length;
if(bestValues==null){
bestValues=new int[n+1][totalweight+1];
}
}

public void solve(){
System.out.println("给定背包: ");
for(Knapsack b:bags){
System.out.println(b);
}
System.out.println("给定总重量:"+totalweight);

for(int j=0;j<=totalweight;j++){
for(int i=0;i<=n;i++){
if(i==0||j==0){
bestValues[i][j]=0;
}
else{
if(j<bags[i-1].getWeight()){
bestValues[i][j] = bestValues[i-1][j];
}
else{
int iweight=bags[i-1].getWeight();
int ivalue = bags[i-1].getValue();
bestValues[i][j] = Math.max(bestValues[i-1][j], ivalue+bestValues[i-1][j-iweight]);
}
}
}
}
if(bestSolution==null){
bestSolution = new ArrayList<Knapsack>();
}
int tempweight = totalweight;
for(int i=n;i>=1;i--){
if(bestValues[i][tempweight]>bestValues[i-1][tempweight]){
bestSolution.add(bags[i-1]);
tempweight-=bags[i-1].getWeight();
}
if(tempweight==0){
break;
}
bestValue=bestValues[n][totalweight];
}
}
public int getBestValue(){
return bestValue;
    }

public int[][] getBestValues(){
return bestValues;
}

public ArrayList<Knapsack>getBestSolution(){
return bestSolution;
}
}


class KnapsackTest{
public static void main(String[] args) {
Knapsack[] bags = new Knapsack[]{
new Knapsack(2, 13),new Knapsack(1, 10),
new Knapsack(3, 24),new Knapsack(2, 15),
new Knapsack(4, 28),new Knapsack(5, 33),
new Knapsack(3, 20),new Knapsack(1, 8)
};
System.out.println("请输入重量:");
Scanner str = new Scanner(System.in);
int totalweight = str.nextInt();
KnapsackProblem kp = new KnapsackProblem(bags, totalweight);
kp.solve();
System.out.println("------该背包问题的解:------");
System.out.println("最优值:"+kp.getBestValue());
System.out.println("最优解【选取的背包】:");
System.out.println(kp.getBestSolution());
}
}
0 0
原创粉丝点击