Run ID 作者 问题 语言 测评结果 时间 内存 代码长度 提交时间
88665 sh25_shenpy 金明的预算方案 C++ 通过 9 MS 492 KB 1507 2026-05-15 15:23:32

Tests(10/10):


//【P1064】金明的预算方案 - 洛谷 - 100 #include <iostream> #include <algorithm> const int kMaxN = 32000, kMaxM = 60; // 常量名前带 k,符合命名规范 int v[kMaxM + 5][3], p[kMaxM + 5][3]; int f[kMaxN + 5]; int main() { int n, m; std::cin >> n >> m; for (int i = 1; i <= m; ++i) { int _v, _p, _q; std::cin >> _v >> _p >> _q; if (!_q) { // 是主件 v[i][0] = _v; p[i][0] = _p; } else { if (v[_q][1] == 0) { // 是第一个附件 v[_q][1] = _v; p[_q][1] = _p; } else { // 是第二个附件 v[_q][2] = _v; p[_q][2] = _p; } } } for (int i = 1; i <= m; ++i) for (int j = n; j >= 0; --j) { // 用 lambda 表达式代替函数定义(C++11 偷懒专用) auto cost2 = [v, p, i](int x, int y) { return v[i][x] + v[i][y]; }; auto cost3 = [v, p, i](int x, int y, int z) { return v[i][x] + v[i][y] + v[i][z]; }; auto rpp = [v, p, i](int x) { return v[i][x] * p[i][x]; }; if (j >= v[i][0]) // 够买主件 f[j] = std::max(f[j], f[j - v[i][0]] + rpp(0)); if (j >= cost2(0, 1)) // 还够买第一个附件 f[j] = std::max(f[j], f[j - cost2(0, 1)] + rpp(0) + rpp(1)); if (j >= cost2(0, 2)) // 还够买第二个附件 f[j] = std::max(f[j], f[j - cost2(0, 2)] + rpp(0) + rpp(2)); if (j >= cost3(0, 1, 2)) // 还够买两个附件 f[j] = std::max(f[j], f[j - cost3(0, 1, 2)] + rpp(0) + rpp(1) + rpp(2)); } std::cout << f[n] << std::endl; }


测评信息: