题解 | 购物单
购物单
https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4
#include<bits/stdc++.h>
using namespace std;
int main() {
int a, b; // a:预算,b:物品数
cin >> a >> b;
vector<vector<int>> arr(3, vector<int>(b, 0)); // 存储输入
vector<vector<int>> brr(6, vector<int>(b, 0)); // 存储主件及其附件信息
// brr[0][]主件价格 brr[1][]主件重要度
// brr[2][]附件价格 brr[3][]附件重要度
// brr[4][]附件价格 brr[5][]附件重要度
// 输入模块
for (int i = 0; i < b; i++) {
cin >> arr[0][i] >> arr[1][i] >> arr[2][i];
}
// 整合为brr
for (int i = 0; i < b; i++) {
if (arr[2][i] == 0) {
brr[0][i] = arr[0][i];
brr[1][i] = arr[1][i];
} else {
int c = arr[2][i] - 1;
if (brr[2][c] == 0) {
brr[2][c] = arr[0][i];
brr[3][c] = arr[1][i];
} else { // 第二个附件
brr[4][c] = arr[0][i];
brr[5][c] = arr[1][i];
}
}
}
// 动态规划部分
vector<int> dp(a + 1,0); // dp动态数组初始化,a+1表示总共有a+1项,0表示从0开始
for (int i = 0; i < b; i++) {
if (brr[0][i] == 0) continue; // 跳过不存在有效数据的行
// 生成所有可能的组合
vector<pair<int, int>> c;//c={{价格, 满意度},{价格, 满意度}...}
// 组合1:仅主件
c.push_back({brr[0][i], brr[0][i] * brr[1][i]});
// 组合2:主件+附件1
if (brr[2][i] != 0) {
c.push_back({brr[0][i] + brr[2][i],
brr[0][i] * brr[1][i] + brr[2][i] * brr[3][i]});
}
// 组合3:主件+附件2
if (brr[4][i] != 0) {
c.push_back({brr[0][i] + brr[4][i],
brr[0][i] * brr[1][i] + brr[4][i] * brr[5][i]});
}
// 组合4:主件+附件1+附件2
if (brr[2][i] != 0 && brr[4][i] != 0) {
c.push_back({brr[0][i] + brr[2][i] + brr[4][i],
brr[0][i] * brr[1][i] + brr[2][i] * brr[3][i] + brr[4][i] * brr[5][i]});
}
// 更新dp数组!!
for (int j = a; j >= 0; j--) {
for (auto& d : c) { //d引用读取结构体c的记录
if (j >= d.first) {
dp[j] = max(dp[j], dp[j - d.first] + d.second);//更新核心
}
}
}
}
cout << dp[a] << endl;
return 0;
}
#dp#