您的位置:首页 > 其它

背包问题

2016-05-03 14:12 375 查看
package com.experimental.dongtaiguihua;

/*
*  01背包问题具体例子:假设现有容量10kg的背包,另外有3个物品,分别为a1,a2,a3。物品a1重量为3kg,价值为4;物品a2重量为4kg,价值为5;物品a3重量为5kg,价值为6。将哪些物品放入背包可使得背包中的总价值最大?

  这个问题有两种解法,动态规划和贪婪算法。本文仅涉及动态规划。

  先不套用动态规划的具体定义,试着想,碰见这种题目,怎么解决?

  首先想到的,一般是穷举法,一个一个地试,对于数目小的例子适用,如果容量增大,物品增多,这种方法就无用武之地了。

  其次,可以先把价值最大的物体放入,这已经是贪婪算法的雏形了。如果不添加某些特定条件,结果未必可行。

  最后,就是动态规划的思路了。先将原始问题一般化,欲求背包能够获得的总价值,即欲求前i个物体放入容量为m(kg)背包的最大价值c[i][m]——使用一个数组来存储最大价值,当m取10,i取3时,即原始问题了。而前i个物体放入容量为m(kg)的背包,又可以转化成前(i-1)个物体放入背包的问题。下面使用数学表达式描述它们两者之间的具体关系。
*/
public class Backpack {
private final int capaticy = 10;
private final int number = 3;
//声明物品标记数组
private int mark[];
//声明物品的重量数组
private int weight[];
//声明物品的价值数组
private int value[];
//声明保存最大价值的数组
private int [][] maxValue;
public Backpack(){
maxValue = new int [number + 1][capaticy + 1];
mark = new int [number + 1];
weight = new int [number + 1];
value = new int [number + 1];
//为每个物品赋初值
weight[1] = 3; value[1] = 4;
weight[2] = 4; value[2] = 5;
weight[3] = 5; value[3] = 6;

//当物品个数为0的时候,背包最大价值为0
for(int i = 0; i <= capaticy; i++){
maxValue[0][i] = 0;
}
//当背包容量为0的时候,背包最大价值为0
for(int i = 0; i <= number; i++){
maxValue[i][0] = 0;
}

}
public void execute(){
for(int i = 1; i <= number; i++){
for(int j = 1; j <= capaticy; j++){
if(j < weight[i]){
maxValue[i][j] = maxValue[i-1][j];
}else if((maxValue[i - 1][j -weight[i]] + value[i]) > maxValue[i-1][j]){
maxValue[i][j] = maxValue[i - 1][j -weight[i]] + value[i];
}else{
maxValue[i][j] = maxValue[i-1][j];
}

}
}
int j = capaticy;
for(int i = number; i >= 1; i--	){
if(maxValue[i][j] > maxValue[i-1][j]){
j -= weight[i];
mark[i] = 1;
}
}
}

public void print(){
for(int i = 1;i <= number; i++){
for(int j = 1; j <= capaticy; j++){
System.out.printf("%-4d", maxValue[i][j]);
}
System.out.println();
}
System.out.println("最大价值为:" + maxValue[number][capaticy]);
System.out.print("装入背包的物品为:");
for(int i = 1; i <= number; i++){
if(mark[i] == 1){
System.out.print(i + " ");
}
}
}

public static void main(String[] args) {
// TODO Auto-generated method stub
Backpack backpack = new Backpack();
backpack.execute();
backpack.print();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: