背包问题。对上文中提到的背包问题提供的表1(数据文件下载Knapsack.txt,第一行为背包总重量15,物品数量5;第2-6行,分别为第1-5件物品的重量与价值),W=15,编程计算最终背包所装物品的编号、总重量与总价值。要求能够把构造的二维表格输出到文件KnapsackResult.txt中。
====
- /*
- * 动态数组的应用
- */
- package aex7;
- import java.io.*;
- import java.util.*;
- public class Knapsack {
- static int count=0;//背包内物品数量
- static int weight[]={0,0,0,0,0};//物品质量
- static int value[]={0,0,0,0,0};//物品价值
- static int result[]={-1,-1,-1,-1,-1};//背包内物品的最终数量
- public static void main(String[] args){
- String path="e:/Knapsack.txt";
- ArrayList<Integer> list=read(path);//将数据文件导入数组
- for(int i=2,j=0;i<list.size();i=i+2,j++){
- weight[j]=list.get(i);
- }
- for(int i=3,j=0;i<list.size();i=i+2,j++){
- value[j]=list.get(i);
- }
- Knapsack KS=new Knapsack();
- System.out.println(KS.KSC(list.get(1)-1,list.get(0)));
- KS.print();
- KS.write(result);
- }
- public void print(){
- for(int i=0;i<result.length;i++){
- System.out.println(result[i]);
- }
- }
- public void write(int[] list){
- File f=new File("e:/KnapsackResult.txt");
- FileOutputStream fout=null;
- try{
- fout=new FileOutputStream(f,true);
- for(int i=0;i<list.length;i++){
- String s=String.valueOf(list[i]);
- String ss=""+s+"\t\n";
- fout.write(ss.getBytes());//字符串通过字节流输入数组
- }
- }catch(Exception e){
- e.printStackTrace();
- }finally{
- try{
- fout.close();
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- }
- //比较价值
- public int KSC(int n,int count){
- if(n==-1||count==0)
- return 0;
- int tmp1=KSC(n-1,count);
- if(weight[n]>count){
- result[n]=0;
- return tmp1;
- }
- int tmp2=value[n]+KSC(n-1,count-weight[n]);
- if(tmp1>tmp2){
- result[n]=0;
- return tmp1;
- }
- result[n]=1;
- return tmp2;
- }
- //文件写入动态数组
- public static ArrayList read(String path){
- ArrayList<Integer> list=new ArrayList<Integer>();
- BufferedReader input=null;
- try{
- FileReader in=new FileReader(path);
- input=new BufferedReader(in);
- String ss;
- try{
- while((ss=input.readLine())!=null){
- String[] s=(ss.split(" "));
- for(int i=0;i<s.length;i++){
- list.add(Integer.parseInt(s[i].trim()));
- }
- }
- }catch(IOException e){
- e.printStackTrace();
- }
- in.close();
- input.close();
- }catch(Exception e){
- e.printStackTrace();
- }
- return list;
- }
- }
====