所谓的01背包是一种动态规划问题。动态规划的核心就是状态转移方程,本文主要解释01背包状态转移方程的原理。
了解原版动态规划:
超详细!动态规划详解分析(典型例题分析和对比,附源码)_动态规划案例解析-CSDN博客
输入描述
第一行输入四个正整数 n,A,B,C,代表建筑的种类、小易初始的石灰数量、砂岩数量和花岗岩数量。 接下来的n行,每行输入四个正整数a_i,b_i,c_i,v_i,代表每种建筑的石灰消耗、砂岩消耗、花岗岩消耗,以及带来的收益。每个建筑只能最多建一个。
输出描述
一个整数,代表最大收益。
示例 1
3 10 10 10
2 5 8 5
4 5 6 8
6 2 3 3
说明 :造第二个和第三个建筑即可。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n;
long long A, B, C;
cin >> n >> A >> B >> C;
// 初始化动态规划数组
vector<vector<vector<long long>>> dp(A + 1, vector<vector<long long>>(B + 1, vector<long long>(C + 1, 0)));
for (int i = 0; i < n; ++i) {
long long a_i, b_i, c_i, v_i;
cin >> a_i >> b_i >> c_i >> v_i;
// 如果资源消耗量超过初始资源,则跳过这个建筑
if (a_i > A || b_i > B || c_i > C) {
continue;
}
// 从大到小更新 dp 表,避免覆盖问题
for (long long x = A; x >= a_i; --x) {
for (long long y = B; y >= b_i; --y) {
for (long long z = C; z >= c_i; --z) {
dp[x][y][z] = max(dp[x][y][z], dp[x - a_i][y - b_i][z - c_i] + v_i);
}
}
}
}
cout << dp[A][B][C] << endl;
return 0;
}