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

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

10个月前 (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;
}


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣第654题:最大二叉树解题教程 用数组构造最大二叉树

力扣第654题:最大二叉树解题教程 用数组构造最大二叉树

题目解读给定一个不含重复元素的整数数组,我们需要构建一棵最大二叉树。构建规则是:数组中的最大值作为根节点,其左侧子数组构建左子树,右侧子数组构建右子树,然后递归地应用这个规则。这种构建方式体现了分治思...

IOI 1994 洛谷1216:如何用动态规划高效解决数字三角形问题?附完整代码解析

IOI 1994 洛谷1216:如何用动态规划高效解决数字三角形问题?附完整代码解析

题目重解给定一个由数字组成的三角形结构,从顶部出发,每次可以移动到下方相邻的数字,最终到达底部。我们的目标是找到一条路径,使得路径上经过的数字总和最大。这个问题在实际中有许多应用场景,如最优路径规划、...

力扣145:递归之美 轻松掌握二叉树后序遍历

力扣145:递归之美 轻松掌握二叉树后序遍历

题目解读二叉树的后序遍历是一种基础且重要的树遍历方式,其遍历顺序为:先递归地后序遍历左子树,然后递归地后序遍历右子树,最后访问根节点。这种遍历方式特别适合需要先处理子节点再处理父节点的场景,如内存释放...

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

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

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

2024蓝桥杯省赛B组“传送阵”题解(C++代码+图论算法优化)

2024蓝桥杯省赛B组“传送阵”题解(C++代码+图论算法优化)

一、题目解读2024年蓝桥杯省B组“传送阵”题目要求处理一个包含n个节点的图,节点间存在单向传输关系。每个节点i可传送至a[i]指定的节点,形成可能存在的环结构。题目需求解从任意节点出发能到达的最长路...

LeetCode 120题三角形最小路径和最优解法:动态规划详解与代码实现

LeetCode 120题三角形最小路径和最优解法:动态规划详解与代码实现

一、题目解读LeetCode 120题“三角形最小路径和”要求给定一个由数字组成的三角形,从顶部开始向下移动,每次可向左或向右移动一格,计算从顶至底的最小路径和。三角形以二维向量形式给出,每层元素数量...

发表评论

访客

看不清,换一张

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