2021-10-26 数据结构学习-0/1背包

问题:背包最大容量maxweight,不同物件质量和价值weight[],value[]

求出背包能装最大质量物件且物件不能重复的前提下所装的最大价值为多少

思路:将不同情况制作成bv[i][j]矩阵

且每个块的值有两种情况选当前物品和不选当前物品。

选当前物品:应考虑到背包容量是否在选完物品后有剩余,即还能装其他物品,则价值为当前物品价值加上剩余容量的最大价值,而容量x的最大价值的情况为bv[i-1][x],即上一行中背包容量为x的块

b[i][j]=value[i]+bv[i-1][j-weight[i]]

不选当前物品:直接取上一行中相同列背包的块

bv[i][j]=bv[i-1][j]

ps:特殊情况 第一列时第一种情况块的值直接设置为value[i]即可,第二种情况直接设置为0.

背包容量(kg)(行为i列为j)1234
物品1150150150150
物品2150150200350
物品3150150200450

 

 

public class backpack {

    public static void main(String[] args) {

int maxweight=4;
int weight[]= {1,3,4,74};
int value[]= {150,200,300};
int bv[][]= new int[weight.length][maxweight+1];//最大价值矩阵
for(int i=0;i<weight.length;i++)
{
    for(int j=1;j<=maxweight;j++)
    {
        if(weight[i]<=j)//如果当前背包空间大于当前物品的重量
        {
            if(i==0)
                bv[i][j]=value[i];
            
            else bv[i][j]=Math.max(bv[i-1][j],value[i]+bv[i-1][j-i]);
        }
        else //背包当前空间小于当前物品质量 则取上一级的值
        {
            if(i==0)
                bv[i][j]=0;//若都一个当前物品就大于当前背包容量
            else
            bv[i][j]=bv[i-1][j];        
            
        }
    }
}
int maxcount=0;
for(int i=0;i<bv.length;i++)//打印结果
{
    for(int j=0;j<bv[i].length;j++)
    {
        if(bv[i][j]>=maxcount)
            maxcount=bv[i][j];//找到最大值
        System.out.print(bv[i][j]+" ");
    }
    System.out.println();
}
System.out.println("背包最大的价值是:"+maxcount);
    }
    
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值