编程要求:(数据文件下载Knapsack.txt,第一行为背包总重量15,物品数量5;第2-6行,分别为第1-5件物品的重量与价值),W=15,编程计算最终背包所装物品的编号、总重量与总价值。要求能够把构造的二维表格输出到文件KnapsackResult.txt中。
实现代码:
/**
* 程序功能:实现简单的01背包,文件读取写入
* 作者:冯得晟
* 时间:2014.04.23
*/
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
public class knapsack {
public static ArrayList Read(String path){ //读取文件
ArrayList<Integer> list = new ArrayList<Integer>();
try{
BufferedReader reader = new BufferedReader(new FileReader(path));
String s;
try{
while((s = reader.readLine()) != null){
String []str = (s.split(" "));
for(int i = 0;i < str.length;i++){
list.add(Integer.parseInt(str[i].trim()));
}
}
}catch (IOException e){
e.printStackTrace();
}
reader.close();
}catch (IOException e){
e.printStackTrace();
}
return list;
}
//写文件
public static void write(ArrayList list) throws IOException{
OutputStreamWriter outputStream = new OutputStreamWriter(new FileOutputStream("H:\\学习\\大三\\大三 下\\算法概论\\课后作业\\背包问题KnapsackResult.txt"));
for(int i = 0;i < list.size();i++){
outputStream.write(list.get(i)+" ");
outputStream.write("\r\n");
}
outputStream.close();
}
public static float[][] packmes(ArrayList<Integer> list){ //物品信息
int w,n;
w = list.get(0);
n = list.get(1);
float[][] arc = new float[n][4];
//初始化数组
for(int i = 0;i < n;i++){
for(int j = 0;j < 4;j++){
arc[i][j] = 0;}
}
for(int i = 0;i < n;i++){
int l = list.get(2*i+2);
int v = list.get(2*i+3);
arc[i][0] = i+1; //物品编号
arc[i][1] = list.get(2*i+2); //物品重量
arc[i][2] = list.get(2*i+3); //物品价值
arc[i][3] = (float)v/l; //物品平均价值
}
for(int j =0;j <arc.length;j++){ //对物品平均价值进行排序
for(int k =j+1;k <arc.length;k++){
if(arc[j][3] < arc[k][3]){
float t,m,o,p;
m = arc[j][0];
arc[j][0] =arc[k][0];
arc[k][0] =m;
o = arc[j][1];
arc[j][1] =arc[k][1];
arc[k][1] =o;
p = arc[j][2];
arc[j][2] =arc[k][2];
arc[k][2] =p;
t =arc[j][3];
arc[j][3] =arc[k][3];
arc[k][3] =t;
}
}
}
return arc;
}
public static float[][] knapscack(int w,float a[][]){ //背包数组
float pack[][] = new float[a.length][3];
float count = 0;
for(int i = 0;i < a.length;i++){
if(count+a[i][1] < w){
count = count+a[i][1];
pack[i][0] = a[i][0];
pack[i][1] = a[i][1];
pack[i][2] = a[i][2];
}
}
return pack;
}
public static void main(String[] args) throws IOException{
int v = 0,w = 0;
ArrayList list = Read("H:\\学习\\大三\\大三 下\\算法概论\\课后作业\\背包问题\\Knapsack.txt");
ArrayList<Integer> list1 = new ArrayList<Integer>();
float arc[][] = packmes(list);
float a[][] = knapscack((Integer) list.get(0),arc);
System.out.println("背包所装物品的编号是:");
for(int i = 0;i < a.length;i++){
if((int)a[i][0] != 0){
list1.add((int)a[i][0]);
System.out.println((int)a[i][0]);
}
v = (int) (v+a[i][2]);
w = (int) (w+a[i][1]);
}
list1.add(w); //背包所装物品的总重量
list1.add(v); //背包所装物品的总价值
write(list1);
System.out.println("背包所装物品的总重量是:"+w);
System.out.println("背包所装物品的总价值是:"+v);
}
}
.