前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >再谈二维费用背包

再谈二维费用背包

作者头像
摆烂小白敲代码
发布2024-09-23 16:36:49
820
发布2024-09-23 16:36:49
举报
文章被收录于专栏:学习

二维费用背包呢,编者感觉是二重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题库

代码语言:javascript
复制
#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背包的推广,所谓道生一,一生二,二生三,三生万物。既然有二维费用背包,那是不是就有三维、四维……

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-09-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档