再谈二维费用背包

简介: 再谈二维费用背包

二维费用背包呢,编者感觉是二重01背包的进化体,之前我们讨论的都是只有一个限定背包容量,比如在背包容量为V所能获得的价值,现在二维费用背包就是又加上了重量,比如背包容量为V且背包重量不能超过为M所能获得的价值。

二维费用背包问题是经典的动态规划问题之一,与普通的背包问题不同,它引入了两种不同的费用。问题的描述通常是这样的:给定一组物品,每个物品有两种费用(比如重量和体积),以及每个物品对应的价值。目标是选择一些物品放入背包中,使得在两种费用的限制下,背包中物品的总价值最大。

问题的状态转移方程通常表示为:

dp[j][k]=max(dp[j][k],dp[j-v[i]][k-m[i]]+w[i]);

其中:dp[j][k]表示在考虑体积为j重量为k的情况下的最大总价值。

请注意,以上是一般形式的二维费用背包问题。具体问题的实现可能会有一些差异,具体问题的要求需要根据实际情况进行调整。

这里用acwing上的例题:8. 二维费用的背包问题 - AcWing题库

#include<iostream>
using namespace std;
int N,V,M;
int v[1005],m[1005],w[1005],dp[1005][1005];
//dp[i][j]表示体积为i重量为j的情况下所获得最大价值
int main(){
    cin>>N>>V>>M;//N个物品V背包体积M背包所承受最大重量
    for(int i=1;i<=N;i++){
        cin>>v[i]>>m[i]>>w[i];
        for(int j=V;j>=v[i];j--){
            for(int k=M;k>=m[i];k--){//这里按照01背包一维优化分两个for来写
                dp[j][k]=max(dp[j][k],dp[j-v[i]][k-m[i]]+w[i]);//要么选第i个物品要么就不选
            }
        }
    }
    cout<<dp[V][M]<<endl;
    return 0;
}

其实二维费用背包没有什么特别说的,就是01背包的推广,所谓道生一,一生二,二生三,三生万物。既然有二维费用背包,那是不是就有三维、四维……


具体的解法都是雷同的,这里不再解释,这里二维费用背包谈的比较浅,一些地方写的不是很好,有错误的地方请大家指出,共同进步,感谢大家支持。下篇更新分组背包。

相关文章
|
6月前
|
算法
算法系列--动态规划--背包问题(5)--二维费用背包问题(上)
算法系列--动态规划--背包问题(5)--二维费用背包问题(上)
57 0
|
6月前
|
算法
算法系列--动态规划--背包问题(5)--二维费用背包问题(下)
算法系列--动态规划--背包问题(5)--二维费用背包问题(下)
40 0
|
算法 Java
代码随想录算法训练营第三十四天 | LeetCode 860. 柠檬水找零、406. 根据身高重建队列、452. 用最少数量的箭引爆气球
代码随想录算法训练营第三十四天 | LeetCode 860. 柠檬水找零、406. 根据身高重建队列、452. 用最少数量的箭引爆气球
64 0
|
人工智能 算法 决策智能
动态规划之背包问题(01背包问题、完全背包问题、方案数填满型背包问题)
动态规划之背包问题(01背包问题、完全背包问题、方案数填满型背包问题)
248 1
算法训练Day35|860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球
算法训练Day35|860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球
|
机器学习/深度学习 存储 算法
【基础算法训练】—— 01背包 + 排序
【基础算法训练】—— 01背包 + 排序
178 0
【基础算法训练】—— 01背包 + 排序
01背包问题及二维费用背包问题(二)
01背包问题及二维费用背包问题
231 0
01背包问题及二维费用背包问题(二)
|
算法
分组背包问题与背包问题求具体方案(一)
AcWing算法提高课内容,本文讲解 动态规划
193 0
分组背包问题与背包问题求具体方案(一)
|
算法
分组背包问题与背包问题求具体方案(二)
AcWing算法提高课内容,本文讲解 动态规划
195 0
分组背包问题与背包问题求具体方案(二)