关注
根本就不需要排序。直接就是0-1背包问题啊。而且我一直不明白为什么你们总是一开始就开辟那么大的数组空间?为什么都不用vector? #include <iostream>
#include <vector>
#include <cassert>
#include <algorithm>
using namespace std;
// 需要填充一个容量为X的背包,使得成就点数最大
class Knapsack01 {
private:
vector<vector<int>> memo;
// 用 [0...index]的物品,填充容积为c的背包的最大价值
int bestValue(const vector<int> &w, const vector<int> &v, int index, int c) {
if (c <= 0 || index < 0)
return 0;
if (memo[index][c] != -1)
return memo[index][c];
int res = bestValue(w, v, index - 1, c);
if (c >= w[index])
res = max(res, v[index] + bestValue(w, v, index - 1, c - w[index]));
memo[index][c] = res;
return res;
}
public:
int knapsack01(const vector<int> &w, const vector<int> &v, int C) {
assert(w.size() == v.size() && C >= 0);
int n = w.size();
if (n == 0 || C == 0)
return 0;
memo.clear();
for (int i = 0; i < n; i++)
memo.push_back(vector<int>(C + 1, -1));
return bestValue(w, v, n - 1, C);
}
};
int main() {
// X为暑假天数,N为游戏数量
int X, N;
cin >> X >> N;
int w, v;
// vs存的是价值(成就点数)
// ws存的是每一件物品的重量(天数)
vector<int> vs, ws;
for (int i = 0; i < N; i++) {
cin >> w >> v;
vs.push_back(v);
ws.push_back(w);
}
cout << Knapsack01().knapsack01(ws, vs, X) << endl;
return 0;
}
1
相关推荐
点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 哪些公司在招寒假实习? #
11905次浏览 152人参与
# 你怎么看待AI面试 #
133175次浏览 742人参与
# MiniMax求职进展汇总 #
617次浏览 23人参与
# 26年哪些行业会变好/更差 #
16856次浏览 224人参与
# 找工作时的取与舍 #
115000次浏览 848人参与
# 去年的flag与今年的小目标 #
8436次浏览 177人参与
# 卷__卷不过你们,只能卷__了 #
10148次浏览 226人参与
# 写论文的崩溃时刻 #
5258次浏览 128人参与
# 腾讯音乐求职进展汇总 #
147557次浏览 1048人参与
# 关于春招你都做了哪些准备? #
122069次浏览 704人参与
# 晒一晒你收到的礼盒 #
95127次浏览 461人参与
# 你不能接受的企业文化有哪些 #
10301次浏览 153人参与
# 有深度的简历长什么样? #
15144次浏览 317人参与
# 求职你最看重什么? #
150759次浏览 875人参与
# 入职第一天 #
9204次浏览 196人参与
# 你都用AI做什么 #
6101次浏览 144人参与
# 你觉得第一学历对求职有影响吗? #
219841次浏览 1226人参与
# 机械人求职现状 #
31650次浏览 292人参与
# 现在前端的就业环境真的很差吗 #
491826次浏览 5961人参与
# 聊聊你的职场新体验 #
310679次浏览 1838人参与
# 工作丧失热情的瞬间 #
346852次浏览 2518人参与

查看13道真题和解析