当前位置:首页 > 牛客 > 牛客DP41精讲:当背包必须装满时,你的状态转移方程该如何调整?

牛客DP41精讲:当背包必须装满时,你的状态转移方程该如何调整?

3个月前 (05-21)

牛客DP41精讲:当背包必须装满时,你的状态转移方程该如何调整? 牛客 动态规划 01背包 01背包变体 算法 C++ 状态转移方程 递推 第1张

题目重解

我们面对一个经典背包问题的变体:给定n个物品,每个物品有重量w和价值v,背包容量为V。需要回答两个问题:1) 普通情况下能获得的最大价值;2) 必须恰好装满背包时的最大价值(若无法装满则输出0)。这就像旅行前收拾行李箱,既要考虑普通装箱,又要应对航空公司严格的重量限制。

解题思路

代码分为清晰的两阶段:

常规背包处理:初始化dp数组全为0,通过逆序更新保证物品只选一次。状态转移方程dp[j] = max(不选当前物品, 选当前物品)体现经典01背包思想。

必须装满的处理:将dp初始值设为负数(代码中用-10000模拟),仅dp[0]=0。这样只有恰好达到j容量的状态才能被有效转移,最终结果需与0比较避免负值输出。

代码和注释

#include <cstdlib>
#include<iostream>
using namespace std;
int main() {
    // 输入物品数n和背包容量V
    int n, V;
    cin >> n >> V;

    // 动态分配数组存储重量w和价值v
    int* v=new int[n];
    int* w=new int[n];
    for(int i=0;i<n;i++)
        cin>>w[i]>>v[i];

    // 常规01背包处理
    int* dp = new int [V + 1]; 
    for(int i=0;i<=V;i++){
        dp[i]=0; // 初始化:什么都不装时价值为0
    }

    for(int i=1;i<=n;i++){ // 遍历每个物品
        for(int j=V;j>=w[i-1];j--){ // 逆序更新防止重复选取
            dp[j]=max(dp[j], v[i-1]+dp[j-w[i-1]]); // 经典状态转移
        }
    }
    cout<<dp[V]<<endl; // 输出常规解

    // 必须装满背包的处理
    for(int i=1;i<=V;i++){
        dp[i]=-10000; // -∞初始化表示不可达状态
    }

    for(int i=1;i<=n;i++){
        for(int j=V;j>=w[i-1];j--){
            dp[j]=max(dp[j], v[i-1]+dp[j-w[i-1]]); // 转移方程相同但初始条件不同
        }
    }
    cout<<max(dp[V],0); // 负数时输出0表示无法装满
    return 0;
}


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣740.删除并获得点数 预处理与动态规划的巧妙融合

力扣740.删除并获得点数 预处理与动态规划的巧妙融合

题意解析:给定一组数字,每当你选择一个数字x时,所有等于x-1和x+1的数字都会被自动移除。你需要通过巧妙的选择顺序,最大化获得的点数总和。这个问题可以转化为对离散化数字分布的动态规划问题——将相邻数...

力扣933题:队列的妙用:如何高效统计最近请求

力扣933题:队列的妙用:如何高效统计最近请求

题目重解:我们需要设计一个能统计最近3000毫秒内请求次数的系统。每当新的请求到来时,它会带有时间戳t,我们需要返回过去3000毫秒内(包括当前)发生的请求总数。这就像是在时间轴上维护一个滑动窗口,只...

从零到一掌握背包问题:洛谷P1164题解精讲,附带优化

从零到一掌握背包问题:洛谷P1164题解精讲,附带优化

题目重解:小A带着m元钱来到餐馆,菜单上有n道菜,每道菜都有确定的价格。现在需要计算出刚好花完m元的点菜方案总数。这个问题看似简单,但当菜品数量增多时,暴力枚举就会变得不可行,需要更高效的算法来解决。...

GESP2023年六级真题解析:动态规划解决小杨买饮料问题(洛谷3873)

GESP2023年六级真题解析:动态规划解决小杨买饮料问题(洛谷3873)

一、题目解读小杨买饮料是GESP 2023年六级认证考试中的一道经典动态规划题目,考察学生对背包问题的理解和应用能力。题目描述小杨需要购买n种饮料,每种饮料有特定的体积w和价格v,他要在不超过容量l的...

CSP-J 2019纪念品题解(洛谷P5662):动态规划+完全背包问题的实战应用

CSP-J 2019纪念品题解(洛谷P5662):动态规划+完全背包问题的实战应用

一、题目解读2019年CSP-J的“纪念品”问题(对应洛谷P5662)要求玩家在T天内通过买卖纪念品最大化金币收益。每天可交易N种商品,需计算最优策略下的最终金币数。题目强调动态规划思维与资源分配优化...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。