第七周__背包问题

package bbb;

import java.io.File;  
import java.io.FileWriter;  
import java.io.IOException;    
import java.util.Scanner;  
  
public class Knapsack {  
      
    public static void main(String[] args) {  
        Scanner scanner = new Scanner(Knapsack.class.getResourceAsStream("e:/Knapsack.txt"));     
        try {  
            FileWriter out = new FileWriter(new File("e:/KnapsackResult.txt"));    
            int W=scanner.nextInt(), n=scanner.nextInt();  
            int wv[][] = new int[n][2];  
            for(int i=0; i<n; i++){  
                wv[i][0]=scanner.nextInt();  
                wv[i][1]=scanner.nextInt();  
            }  
              
            Knapsack knapsack = new Knapsack();  
            int K[][] = knapsack.getArray(W, n, wv);              
                
            for(int w=0; w<=W; w++){  
                for(int j=0; j<=n; j++){  
                    out.write(K[w][j]+"\t");  
                }  
                out.write("\r\n");  
            }  
            out.close();  
            scanner.close();  
              
            int[] isTaked = getIsTaked(wv, K, W, n);  
            System.err.println("放入背包中的物品总重量为: "+isTaked[0]);  
              
            System.err.println("放入背包中的物品编号为: ");  
            for(int No=1; No<isTaked.length; No++){  
                if(isTaked[No] == 1) System.err.print(No + "\t");  
            }  
        } catch (IOException e) {    
            e.printStackTrace();  
        }         
          
          
          
          
           
    }  
    public int[][] getArray(int W, int n, int wv[][]){  
  
        int[][] K = new int[W+1][n+1];  
          
        for(int j=1; j<=n; j++){  
            for(int w=1; w<=W; w++){  
                int maxW = wv[j-1][0];  
                if(maxW>w){  
                    K[w][j] = K[w][j-1];  
                }else{  
                    K[w][j] = max(K[w][j - 1],K[w - maxW][j - 1]+wv[j - 1][1]);  
                }  
            }  
        }  
        return K;  
    }  
      
    public int max(int a, int b){  
        return a>b ? a : b;  
    }  
      
    public static int[] getIsTaked(int[][] wv,int[][] K,int W,int n){  
  
        int isTaked[]=new int[n+1];  
          
        int w = W;        
        for(int j=n;j>0;j--){  
            if(K[w][j]>K[w][j-1]){  
                isTaked[j]=1;  
                w = w - wv[j-1][0];  
                if(w<0) break;  
            }  
        }         
          
        int sumW=0;  
        for(int j=1;j<=n;j++){  
            if(isTaked[j]==1){  
                sumW+=wv[j-1][0];  
            }  
        }  
        isTaked[0] = sumW;  
          
        return isTaked;  
    }  
      
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值