AcWing 8:二维费用 0/1 背包问题 ← 模板题

【题目来源】
https://www.acwing.com/problem/content/8/

【题目描述】
有 N 件物品和一个容量是 V 的背包,背包能承受的最大重量是 M。
每件物品只能用一次。体积是 vi,重量是 mi,价值是 wi。
求解将哪些物品装入背包,可使物品总体积不超过背包容量,总重量不超过背包可承受的最大重量,且价值总和最大。
输出最大价值。

【输入格式】
第一行三个整数,N,V,M,用空格隔开,分别表示物品件数、背包容积和背包可承受的最大重量。
接下来有 N 行,每行三个整数 vi,mi,wi,用空格隔开,分别表示第 i 件物品的体积、重量和价值。

【输出格式】
输出一个整数,表示最大价值。

【数据范围】
0<N≤1000
0<V,M≤100
0<vi,mi≤100
0<wi≤1000

【算法分析】
● 二维费用背包是背包问题的重要扩展形式,其核心特征在于双资源约束。正因如此,在求解时我们通常采用二维数组来表示满足双资源约束下的最大价值,这便是二维动态规划实现。而根据物品选取规则的不同,二维费用背包又可进一步分为二维费用 0/1 背包、二维费用完全背包、二维费用多重背包等典型类型。

● 二维费用的背包问题,要求对于装入背包的每个物品 i,必须同时满足两种不同的限制条件 vol1[i] 与 vol2[i],且每种限制条件的上限分别为 V1 与 V2。若设将物品 i 装入背包可获得的价值为 val[i],请问怎么选择物品,可得到最大价值。
(1)下面以二维费用的 0-1 背包问题为例,给出一般的二维费用背包问题的解题思路如下:
令 c[i][j][k] 表示将前 i 种物品装入限制条件1为 j、限制条件2为 k 时,可获得的最大价值。
根据求解普通 0-1 背包问题的状态转移方程的思路,相应可得二维费用的 0-1 背包问题的状态转移方程为:
c[i][j][k] = max(c[i−1][j][k], c[i−1][j−vol1[i]][k−vol2[i]] + val[i] )
(2)类似于将普通 0-1 背包问题由二维优化为一维的思路(https://blog.csdn.net/hnjzsyjyj/article/details/126071689),可以将二维费用的 0-1 背包问题由三维优化为二维,从而达到降低算法时间复杂度的目的。优化为二维后的二维费用的 0-1 背包问题的状态转移方程为:
c[j][k] = max(c[j][k], c[j−vol1[i]][k−vol2[i]] + val[i])
(3)编写代码时,一般采用如下的3重循环: 

for (i=1; i<=n; i++)   // 此行语句也常用 while(n--) 代替,其中的n为物品个数
	for (j=V1; j>=vol1[i]; j--)
		for (k=V2; k>=vol2[i]; k--) {
			c[j][k]=max(c[j][k],c[j-vol1[i]][k-vol2[i]]+val[i]);
		}

所求最大价值为 c[V1][V2]。

【算法代码】

#include <bits/stdc++.h>
using namespace std;

const int N=1e3+5;
int f[N][N];
int vol[N],wht[N],val[N];

int main() {
    int n,V,W;
    cin>>n>>V>>W;
    for(int i=1; i<=n; i++) {
        cin>>vol[i]>>wht[i]>>val[i];
    }

    for(int i=1; i<=n; i++) {
        for(int j=V; j>=vol[i]; j--) {
            for(int k=W; k>=wht[i]; k--) {
                f[j][k]=max(f[j][k],f[j-vol[i]][k-wht[i]]+val[i]);
            }
        }
    }
    cout<<f[V][W]<<endl;

    return 0;
}

/*
in:
4 5 6
1 2 3
2 4 4
3 4 5
4 5 6

out:
8
*/



【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/126229598
https://blog.csdn.net/hnjzsyjyj/article/details/126228900



 

 

posted @ 2026-03-27 06:11  Triwa  阅读(2)  评论(0)    收藏  举报