[0-1背包]解决思路总结----VIVO2021提前批

1.三种背包问题

先来回顾一下三个背包问题的定义:
01背包:
有N件物品和一个容量为V的背包,第i件物品消耗的容量为Ci,价值为Wi,求解放入哪些物品可以使得背包中总价值最大。

完全背包:
有N种物品和一个容量为V的背包,每种物品都有无限件可用,第i件物品消耗的容量为Ci,价值为Wi,求解放入哪些物品可以使得背包中总价值最大。

多重背包:
有N种物品和一个容量为V的背包,第i种物品最多有Mi件可用,每件物品消耗的容量为Ci,价值为Wi,求解入哪些物品可以使得背包中总价值最大。

给出代码和注释


public class Main {
    public static void main(String[] args)   {
        int bag=10;
        int[] weight={1,3,5,3,5,1,5};
        int[] price= {4,1,2,5,7,3,12};
        int num=weight.length; //物品数量
        int[][] dp=new int[num+1][bag+1];  //定义一个二维矩阵,每个位置代表当前容量下放入当前物品的最大值

        for(int i=1;i<=num;i++){  //i个物品
            for(int j=1;j<=bag;j++){   //背包的大小
            //解释第一轮循环的含义,当当前待选择的物品为1时,根据当前背包的容量不同,选择是否放入当前物品
            //如果当前物品的重量超过背包大小,则不放
            //然后再判断当前物品放入之前和放入之后的数值大小,放入之后的数值大小计算方式为dp[i-1][j-weight[i-1]]+price[i-1]
            //,因为若要放入,则需要前一次的容量还需要留空
                if(weight[i-1]>j){
                    dp[i][j]=dp[i-1][j];
                }else{
					dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-weight[i-1]]+price[i-1]);
                }
            }
        }
        //输出最大值
        System.out.println(dp[weight.length][bag]);
    }
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值