买口罩(0-1背包)

这篇博客探讨了如何运用动态规划解决0-1背包问题,其中物品的权重和价值分别是wt和val数组。代码示例展示了如何在限定的价格(容量W)下,求解最多能购买多少口罩(价值最大化)。核心算法通过遍历所有物品和容量,根据不放入和放入物品两种情况取最大值更新dp数组。
摘要由CSDN通过智能技术生成

链接

题目:
在这里插入图片描述

思路: 0-1 背包

背包两个属性:容量W和N个物品(N个数一般等于物品数量,即 状态 i
限定的是什么钱,即钱就是限定的容量W,对应物品单价就是wt
最多买多少口罩,即口罩的个数就是val值;

初始化 dp[N+1][W+1],

dp定义:最终所求为 dp[N][W]即对前 i 个物品进行选择,【在容量为 w时】,可以装的最大价值是 dp[i][w];

basecase:
base case 就是 dp[0][…] = dp[…][0] = 0,即没有物品和没有容量时,背包装的价值为0;但数组会自动初始化为0;

状态: i 为物品序号, w为每种容量;

状态转移
求以下两种的最大值:
1.不装入 i 物品,dp[i][w]=dp[i-1][w] ;
2.装入 i 物品,dp[i][w]=dp[i-1][w-wt[i]]+val[i] ,即前i-1个物品相当于放到了容量为 w - wt[i-1]]的背包里!

注意
i =0 是base case , 所以遍历状态要从 i=1 开始!

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        int W=in.nextInt();
        // 限定了N元,即价格是背包容量
        int[] wt={0,2,2,3,1,5,2};
        // 求最多多少口罩,即口罩个数是价值
        int[] val={0,2,3,1,5,4,3};
        int N=6;
        int[][] dp=new int[n+1][W+1]; // 会初始化为全0
        // i=0 和w=0 都无效,都是0 !
        for(int p=0;p<=W;p++){
            dp[0][p]=0; //没有物品
        }
        for(int q=0;q<=N;q++){
            dp[q][0]=0;//没有容量
        }
        //
        for(int i=1;i<=N;i++){//遍历每个物品(序号)
            for(int w=1;w<=W;w++){ //遍历每种容量大小
                if(w<wt[i]){ //当前容量w小于了物品i需要的容量,则一定不放背包
                    dp[i][w]=dp[i-1][w];
                }else{ //  放入和不放入,选最大
                    dp[i][w]=Math.max( dp[i-1][w] , dp[i-1][w-wt[i]]+val[i]);
                }
            }                 
        }
        System.out.println(dp[N][W]);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值