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

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

数据表:

背包问题存在两个版本,一种是每种物品的数量是无限的多副本的背包问题和每种物品都只有一件的单副本的背包问题,两种问题的解决思路都不相同。

多副本的背包问题的具体算法描述为:

K(0)=0

for w=1 to W

      k(w)=max(k(w-wi)+vi:wi<w)

return k(W)

单副本的背包问题的算法描述为:

Initialize all k(0,j)=0 and all k(w,0)=0

for j=1 to n:

  for w=1 to W:

    if wj>w:k(w,j)=K(w,j-1)

    else :k(w,j)=max{k(w,j-1),k(w-wj,j-1)+vj}

return k(W,n)

实现代码:

import java.io.*;

public class bag 
{
	static int max(int a,int b)
	{
		if(a>b)
			return a;
		else 
			return b;
	}
	public static void main(String[] args)
	{
		try
		{
			FileReader fr=new FileReader("d:\\1\\Knapsack.txt");
			 BufferedReader br=new BufferedReader(fr);
			 int w,i,t1,a,b;
			 String str="";
			 while((t1=br.read())!=' ')
			 {
				 str = str + (char) t1;
			 }
			 w = Integer.parseInt(str.trim());
			 
			 str="";
			 while((t1=br.read())!='\n')
			 {
				 str = str + (char) t1;
			 }
			 i = Integer.parseInt(str.trim());

			 str="";
			 //System.out.println(w);
			 //System.out.println(i);
			 int[][] wv=new int[i][2];
			 int ki=i+1,kw=w+1;
			 i++;w++;
			 int[][] k=new int [i][w];
			 a=0;
			 int t2;
			 while((t2=br.read())!=-1)
			 {
				 str = str + (char) t2; 
				 if((char)t2==' ')
				 {
					 wv[a][0] = Integer.parseInt(str.trim());
					 str="";
					 //System.out.println(wv[i][0]);
				 }
					 
				 if((char)t2=='\n')
				 {
					 wv[a][1] = Integer.parseInt(str.trim()); 
					 str="";
					 a++;
				 }
					 
			 }
			 //单副本方法
			 for(a=0;a<i;a++)
				 k[a][0]=0;
			 for(a=0;a<w;a++)
				 k[0][a]=0;
			 for(a=1;a<i;a++)
				 for(b=1;b<w;b++)
				 {
					 if(wv[a-1][0]>b)
						 k[a][b]=k[a-1][b];
					 else
						 k[a][b]=max(k[a-1][b],k[a-1][b-wv[a-1][0]]+wv[a-1][1]);
					//由于在上面i和w都已经增加了1,所以这里a-1才能取到原来的i的最大值
				 }
			 //System.out.println(k[a][b]);
			 
			 
			 
			 
			 FileOutputStream fos = new FileOutputStream("d:\\1\\KnapsackResult01.txt");  
	         OutputStreamWriter osw = new OutputStreamWriter(fos, "gb2312");  
	         BufferedWriter bw = new BufferedWriter(osw); 
	         str="";
	         
	         
	         
			 for(a=0;a<i;a++)
			 {
				 for(b=0;b<w;b++)
				 {
					 str=str+Integer.toString(k[a][b])+" ";
					 System.out.print(k[a][b]+" ");
				 }
				 bw.write(str);  
                 bw.newLine(); 
                 str=""; 
				 System.out.println();
			 }
			 bw.close();  
	         osw.close();			 		 
			 
			 //多副本背包方法
			 int[] k1=new int[w];
			 k1[0]=0;
			 t1=0;
			 for(a=1;a<w;a++)
			 {
				 for(b=0;b<i-1;b++)
				 {
					 if(wv[b][0]<=a)
					 {
						 if(t1<k1[a-wv[b][0]]+wv[b][1])
						 {
							 t1=k1[a-wv[b][0]]+wv[b][1];
						 }
						 //System.out.println(t1);
					 }
				 }
				 k1[a]=t1;
			 }
			 //System.out.println(a);
			 //System.out.println(k1[a-1]);
			 System.out.println();
			 FileOutputStream fos1 = new FileOutputStream("d:\\1\\KnapsackResult02.txt");  
	         OutputStreamWriter osw1 = new OutputStreamWriter(fos1, "gb2312");  
	         BufferedWriter bw1 = new BufferedWriter(osw1); 
	         str="";
	         
	         
			 for(a=0;a<w;a++)
			 {
					 System.out.print(k1[a]+" ");
					 str=str+Integer.toString(k1[a])+" ";
			 }
			 
			 bw1.write(str);  
             bw1.newLine(); 
             bw1.close();  
	         osw1.close();
			 
			 br.close();
			 fr.close();
			 			 			 		 		
		}
		 catch (FileNotFoundException e)  
	        {  
	            e.printStackTrace();  
	        }  
	        catch (IOException e)  
	        {  
	            e.printStackTrace();  
	        }  
	}

}

运行结果:




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值