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());
}
}
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());
}
}