二维费用背包问题(背包九讲)

------------------------------------------

前言:

对于一些背包问题,重点还是在于如何找出“背包容量”和“各种代价”,以及价值,如此问题便迎刃而解了。下午 打篮球居然下冰雹了,悲催了。。。。

------------------------------------------

问题:

二维费用的背包问题是指:对于每件物品,具有两种不同的费用;选择这件物品必须同时付出这两种代价;对于每种代价都有 一个可付出的最大值(背包容量)。问怎样选择物品可以得到最大的价值。设这两种代价分别为代价1和代价2,第i件物品所需的两种代价分别为a[i]和 b[i]。两种代价可付出的最大值(两种背包容量)分别为V和U。物品的价值为w[i]。

算法:

费用加了一维,只需状态也加一维即可。设f[i][v][u]表示前i件物品付出两种代价分别为v和u时可获得的最大价值。状态转移方程就是:f[i][v][u]=max{f[i-1][v][u],f[i-1][v-a[i]][u-b[i]]+w[i]}。如前述方法,可以只使用二维的数组:当每件物品只可以取一次时变量v和u采用逆序的循环,当物品有如完全背包问题时采用顺序的循环。当物品有如多重背包问题时拆分物品。这里就不再给出伪代码了,相信有了前面的基础,你能够自己实现出这个问题的程序。

物品总个数的限制:

有时,“二维费用”的条件是以这样一种隐含的方式给出的:最多只能取M件物品。这事实上相当于每件物品多了一种“件数 ”的费用,每个物品的件数费用均为1,可以付出的最大件数费用为M。换句话说,设f[v][m]表示付出费用v、最多选m件时可得到的最大价值,则根据物
品的类型(01、完全、多重)用不同的方法循环更新,最后在f[0..V][0..M]范围内寻找答案。

复数域上的背包问题:

另一种看待二维背包问题的思路是:将它看待成复数域上的背包问题。也就是说,背包的容量以及每件物品的费用都是一个复 数。而常见的一维背包问题则是实数域上的背包问题。(注意:上面的话其实不严谨,因为事实上我们处理的都只是整数而已。)所以说,一维背包的种种思想方法,往往可以应用于二位背包问题的求解中,因为只是数域扩大了而已。作为这种思想的练习,你可以尝试将P11中提到的“子集和问题”扩展到复数域(即二维),并试图用同样的复杂度解决

当发现由熟悉的动态规划题目变形得来的题目时,在原来的状态中加一纬以满足新的限制是一种比较通用的方法。希望你能从本讲中初步体会到这种方法。

-----------------------------------------

总结:

二维费用背包问题(背包九讲),布布扣,bubuko.com

时间: 2024-12-22 02:05:48

二维费用背包问题(背包九讲)的相关文章

杭电 2159 FATE(二维费用背包问题)

二维费用背包问题: 对于每件物品,具有两种不同的费用:选择 这件物品必须同时付出这两种代价: 对于每种代价都有一个可付出的最 大值(背包容量) .问怎样选择物品可以得到最大的价值.设这两种代 价分别为代价 1 和代价 2 ,第 i 件物品所需的两种代价分别为 a[i] 和 b[i] .两种代价可付出的最大值(两种背包容量)分别为 V 和 U .物品 的价值为 w[i] 对于每件物品,具有两种不同的费用,必须支付这两种费用才能购买到这件物品,对于每种代价都有一个可支付的最大值(背包容量),求怎样选

基础DP中的二维费用的背包

二维费用的背包问题: 指对于每件物品,具有2种不用的费用,选择这件物品需要同时付出2种代价 对于每一种代价都有一个可付出的最大值(背包容量) 问怎么样选择物品可以得到最大的价值 设这2种代价分别为1,2 第i件物品所需的2种代价为a[i] , b[i] 2种代价可付出的最大值为U,V 物品价值为w[i] 费用增加了一维,则状态也增加一维 设f[u][v]表示前i件物品付出代价为u,v时的最大价值 则f[u][v]=max(f[u][v],f[u-a[i]][v-b[i]]+w[i]) 1.物品只

UESTC - 878 温泉旅店 二维费用背包问题

http://acm.uestc.edu.cn/#/problem/show/878 设dp[i][j][k]表示在前i个数中,第一个得到的异或值是j,第二个人得到的异或值是k的方案数有多少种. 因为异或后的大小不确定,所以不能压缩数组,但是也不大..可以过. #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm>

二维费用,依赖,分组背包

二维费用背包 01背包进阶版 有N件物品和一个空间容量为C,重量容量为W的背包,第 i 件物品的空间费用为c[i] ,重量费用为 wi,价值是 vi,每种物品仅有一件,可以选择放或不放,求将哪些物品装入背包可使价值总和最大 01背包: f[i][j]=max(f[i?1][j],f[i?1][j?w[i]]+v[i]) 空间降维写法 for (int i = 1; i <= n; i++) for (int j = V; j >= w[i]; j--) f[j] = max(f[j], f[j

hdu3496+poj1948(二维费用背包)

Watch The Movie Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total Submission(s): 5106    Accepted Submission(s): 1614 Problem Description New semester is coming, and DuoDuo has to go to school tomorrow. She dec

AC_8. 二维费用的背包问题

代码: /* 二维费用背包问题 */ #include<iostream> #include<cstring> #include<algorithm> using namespace std; const int N = 110; int n, v, m; int dp[N][N]; int main() { cin >> n >> v >> m; for (int i = 0; i < n; i++) { int a, b,

背包九讲(转载)

转载 背包问题 //0 1背包 #include<iostream> #include<stdio.h> #include<string.h> using namespace std; int main() { int i,j,n,v,f[1100],w[1100],p[1100]; scanf("%d",&t); while(t--) { memset(f,0,sizeof(f)); scanf("%d%d",&

转---背包九讲

目录 第一讲 01背包问题 第二讲 完全背包问题 第三讲 多重背包问题 第四讲 混合三种背包问题 第五讲 二维费用的背包问题 第六讲 分组的背包问题 第七讲 有依赖的背包问题 第八讲 泛化物品 第九讲 背包问题问法的变化 附:USACO中的背包问题 前言 本篇文章是我(dd_engi)正在进行中的一个雄心勃勃的写作计划的一部分,这个计划的内容是写作一份较为完善的NOIP难度的动态规划总结,名为<解动态规划题的基本思考方式>.现在你看到的是这个写作计划最先发布的一部分. 背包问题是一个经典的动态

膜背包九讲有感ORZ

本咸鱼终于停课了,在Mr.pan的支持下膜了一波背包九讲,为了方便自己以后复习,将先在的一些感悟记录下来. 1.01背包 这种背包是最基础的背包,题目大概是这样: 有 N 件物品和一个容量为 V 的背包.放入第 i 件物品耗费的费用是 Ci,得到的 价值是 Wi.求解将哪些物品装入背包可使价值总和最大. 这个最初始的状态就是f[i][j],f[i][j]表示的是装到第i件物品(无论是否装入),使用了容量为j的背包(无论有没有装满)的时候,所能获得的最大价值.这样的话状态转移方程式就不难想出了f[