第7周作业1——背包问题

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

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.Reader;

public class Knapsack {
	public static int w=0;
	public static int num=0;
	public static void Knapsackm(String fileName){
		File file = new File(fileName);
		Reader reader = null;
		try {
		      reader = new InputStreamReader(new FileInputStream(file));
		      int tempchar;
		      tempchar = reader.read();
		      while(tempchar>=48 && tempchar<=57){
		    	  w=w*10+(tempchar-48);
		    	  tempchar = reader.read();
		      }
		      tempchar = reader.read();
		      while(tempchar>=48 && tempchar<=57){
		    	  num=num*10+(tempchar-48);
		    	  tempchar = reader.read();
		      }
		      int sw[]=new int[num];
		      int sv[]=new int[num];
		      int i=0,j=0,z=0,k=0;
		      while((tempchar=reader.read())!=-1)
		      {
		    	  if(tempchar>=48 && tempchar<=57){
		    		  i=i*10+(tempchar-48);
		    		  k=1;
		    	  }
		    	  if(tempchar==32){
		    		  if(k==1){
		    			  sw[j]=i; j++; k=0; i=0;
		    		  }
		    	  }
		    	  if(tempchar==10){
		    		  if(k==1){
		    			  sv[z]=i; z++; k=0; i=0;
		    		  }
		    	  }
		      }
		      for(int l=0;l<num;l++){
		    	  System.out.println("w= "+sw[l]+"   v= "+sv[l]);
		      }
		      Knapsacks(sw,sv,w,num);
		}catch (Exception e) {
		  		e.printStackTrace();
		}
	}
	
	public static int Knapsacks(int sw[],int sv[],int w,int num){
		int vl=0;
		int ul=0;
		int it=1;
		if(num<1)   //如果剩余物品为零,就结束
			return 0;
		else{
			for(int i=0;i<sv.length;i++){ //寻找所有物品中价值最大的
			   if(ul<sv[i]){
				  ul=sv[i];
				  vl=i;
				  }
			   }
		    if(sw[vl]<=w){   //判断该物品的重量是否超过背包的剩余容量
		    	System.out.println("weight="+sw[vl]+"   value="+sv[vl]);
			    sv[vl]=0;   //将对应的价值数改为0,表示不参加后面的运算
			    w=w-sw[vl]; //背包的剩余容量减掉物品的重量
			    num=num-1;  //物品可选数减1
			    it=Knapsacks(sw,sv,w,num);
			    }
		    else{
			    sv[vl]=0;   //将对应的价值数改为0,表示不参加后面的运算
			    num=num-1;  //物品可选数减1
			    it=Knapsacks(sw,sv,w,num);
			    }
		    return it;
		    }
		}
	public static void main(String args[]){
		String s="G:\\Knapsack.txt";
		Knapsackm(s);
	}
}


运行结果:


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值