第七周作业----背包问题

1.背包问题。对上文中提到的背包问题提供的表1(数据文件下载Knapsack.txt,第一行为背包总重量15,物品数量5;第2-6行,分别为第1-5件物品的重量与价值),W=15,编程计算最终背包所装物品的编号、总重量与总价值。要求能够把构造的二维表格输出到文件KnapsackResult.txt中。

  1. package javapage;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.File;  
  5. import java.io.FileOutputStream;  
  6. import java.io.FileReader;  
  7. import java.io.IOException;  
  8. import java.util.ArrayList;  
  9.   
  10. public class Knapsack {  
  11.   
  12.   
  13.       static int count=0;  //容量为15  
  14.       static int allweight=0;  
  15.       static int weight[]={0,0,0,0,0}; //物品的重量  
  16.       static int value[]={0,0,0,0,0};   //物品的价值  
  17.       static int result[]={-1,-1,-1,-1,-1};//初始化背包  
  18.         
  19.     public static void main(String[] args) {  
  20.         String path = "Knapsack.txt";  
  21.         ArrayList<Integer> list = read(path);  
  22.           
  23.         for(int i=2,j=0;i<list.size();i=i+2,j++){  
  24.             
  25.           weight[j]=list.get(i);  
  26.         }  
  27.         for(int i=3,j=0;i<list.size();i=i+2,j++){  
  28.             
  29.           value[j]=list.get(i);  
  30.         }  
  31.         //控制台打印  
  32.         Knapsack ks=new Knapsack();  
  33.         System.out.println("总价值:"+ks.Knapsacountk(list.get(1)-1,list.get(0)));  
  34.         System.out.print("物品编号:");  
  35.         ks.printNum();  
  36.         System.out.println();  
  37.         System.out.println("总重量:"+allweight);  
  38.         //写入txt  
  39.         ks.writeFile(result);  
  40.           
  41.       }  
  42.   
  43.       public void printNum(){  
  44.         for(int i=0;i<result.length;i++)  
  45.         {  
  46.             if(result[i]==1){  
  47.                 System.out.print(i+1+",");  
  48.                 allweight+=weight[i];  
  49.             }  
  50.         }  
  51.       }  
  52.   
  53.         
  54.       public  void writeFile(int[] list) {  
  55.         File f = new File("KnapsackResult.txt");  
  56.         FileOutputStream fou = null;  
  57.         try {  
  58.           fou = new FileOutputStream(f);  
  59.           String s,a;  
  60.           a=new String("物品编号\t物品重量\t物品价值\t\n");  
  61.           for (int i = 0; i < list.length; i++) {  
  62.               if(list[i]==1){  
  63.                 s = String.valueOf(list[i]);  
  64.                 a += i+1+"    \t" + weight[i] + "    \t"+value[i]+"    \t\n";  
  65.               }  
  66.               
  67.           }  
  68.             fou.write(a.getBytes());  
  69.             fou.close();  
  70.         } catch (Exception e) {  
  71.           e.printStackTrace();  
  72.         }  
  73.       }  
  74.         
  75.         
  76.         
  77.       public int Knapsacountk(int n ,int count)  
  78.       {  
  79.         if(n==-1||count==0)  
  80.           return 0;  
  81.         int tmp1=Knapsacountk(n-1,count);  
  82.         if(weight[n]>count)  
  83.         {  
  84.           result[n]=0;  
  85.           return tmp1;  
  86.         }  
  87.         int tmp2=value[n]+Knapsacountk(n-1,count-weight[n]);  
  88.         if(tmp1>tmp2)  
  89.         {  
  90.           result[n]=0;  
  91.           return tmp1;  
  92.         }  
  93.         result[n]=1;  
  94.         return tmp2;      
  95.       }  
  96.         
  97.         
  98.       // 读取文件到Arraylist 数组  
  99.           public static ArrayList read(String path) {  
  100.             ArrayList<Integer> list = new ArrayList<Integer>();  
  101.             BufferedReader input = null;  
  102.             try {  
  103.               FileReader in = new FileReader(path);  
  104.               input = new BufferedReader(in);  
  105.               String ss;  
  106.                 while ((ss = input.readLine()) != null) {  
  107.                   String[] s = (ss.split("  "));  
  108.                   for (int i = 0; i < s.length; i++) {  
  109.                       list.add(Integer.parseInt(s[i].trim()));   
  110.                   }  
  111.                 }  
  112.               in.close();  
  113.               input.close();  
  114.             } catch (Exception e) {  
  115.               e.printStackTrace();  
  116.             }  
  117.   
  118.             return list;  
  119.           }  
  120.   
  121. }  

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值