java的01背包问题 思路加解析

java的01背包问题

题目描述:有如下5种物品,小明的书包最多只能装下8公斤的物品,小明特别贪心,思考怎么选择使自己书包能装下并且得到的价值最大。
物品1: 6公斤   价值48元
物品2: 1公斤    价值7元
物品3: 5公斤    价值40元
物品4: 2公斤    价值12元
物品5: 1公斤    价值8元

大家先看一下题目五种物品,价值和重量各不一样,但是要求一个背包限重八公斤问你怎么当这些物品你可以取得最大的利益,这里会有一种排列组合的感觉,但是我们可以更加清晰的解决这个问题

我们可以倒着来,不一定一定是从八公斤出发来找到这些排序,比如说我们假设现在只有物品1,在来假设我们书包的最高承重,我们从包包开始只能载重1公斤开始然后慢慢给它加一公斤直到它到达了最高的书包载重8公斤,发现我们现在只有物品1,但是物品1是6公斤,所以说现在只能假设当我们的书包载重6公斤时我们才能装到这个物品一,又因为我们现在也只有物品一,所以当书包载重6,7,8公斤时它的最大利益也只能是48元

接下来我们来看我们现在在有物品1的基础上又多了物品2,还是一样的道理大了装不下只能装到何时的所以现在当我们假设到背包的载重量为6公斤时,你书包现在可以满足装下物品一的条件了,这个时候就是特别重要的时候,你要明白到底是装上这个物品利益大还是不装它利益大了,显而易见肯定是要物品一不要物品二利益大, temp[i][j]=Math.max(temp[i-1][j],temp[i-1][j-weight[i]]+value[i] );这句代码实质就是在比较到底该不该装,再来假设当可取物品三时,取到6公斤时你就会比较物品1与物品2,3相加作比较。
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 48 48 48
0 7 7 7 7 7 48 55 55
0 7 7 7 7 40 48 55 55
0 7 12 19 19 40 48 55 60
0 8 15 20 27 40 48 56 63

import java.util.Scanner;
public class main {
public static void main(String[]args){
	Scanner sc=new Scanner(System.in);
	int[] weight=new int[6];
	int[] value=new int[6];
	 for(int i=1;i<6;i++) {
		 weight[i] = sc.nextInt();//输入重量
		 value[i] = sc.nextInt();//输入价值
        }
	  int [][] temp = new int[6][9];   //8表示背包最多能放8公斤的重量
        for(int j=0;j<9;j++) {  //初始化每一行
            temp[0][j] = 0;
        }
        for(int i=1;i<6;i++) {  //背包的重量为0的时候,最大价值肯定是0
            temp[i][0] = 0;
        }
        for(int i=1;i<6;i++) {
        	 for(int j=1;j<=8;j++) {
        		 if(weight[i]<=j) {
        			 temp[i][j]=Math.max(temp[i-1][j],temp[i-1][j-weight[i]]+value[i] );
        		 }else {
                     temp[i][j] = temp[i-1][j];//第i件物品不能放
                 }
        	 }
        }
        for(int i=0;i<6;i++) {
            for(int j=0;j<9;j++) {
                System.out.print("  "+temp[i][j]);
            }
            System.out.println();
        }
}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值