关注
根本就不需要排序。直接就是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
相关推荐
点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
正在热议
# 25届秋招总结 #
430642次浏览 4361人参与
# 实习,投递多份简历没人回复怎么办 #
2449741次浏览 34816人参与
# 阿里云管培生offer #
66928次浏览 1871人参与
# 地方国企笔面经互助 #
7558次浏览 18人参与
# ai智能作图 #
37963次浏览 460人参与
# 虾皮求职进展汇总 #
103339次浏览 827人参与
# 北方华创开奖 #
68552次浏览 568人参与
# 发工资后,你做的第一件事是什么 #
11361次浏览 56人参与
# 实习想申请秋招offer,能不能argue薪资 #
38501次浏览 313人参与
# 工作中,努力重要还是选择重要? #
34184次浏览 379人参与
# 双非本科求职如何逆袭 #
660218次浏览 7377人参与
# 机械求职避坑tips #
24368次浏览 253人参与
# 参加完秋招的机械人,还参加春招吗? #
19753次浏览 238人参与
# 我的实习求职记录 #
6149151次浏览 84120人参与
# 你投递的公司有几家约面了? #
32921次浏览 187人参与
# 25届机械人为了秋招做了哪些准备? #
26922次浏览 367人参与
# 机械人春招想让哪家公司来捞你? #
157375次浏览 2267人参与
# 软件开发投递记录 #
1485344次浏览 23971人参与
# 机械人怎么评价今年的华为 #
158620次浏览 1354人参与
# 工作两年想退休了 #
56308次浏览 726人参与
# 提前批简历挂麻了怎么办 #
149402次浏览 1971人参与
# 如果再来一次,你还会选择这个工作吗? #
122208次浏览 1190人参与