关注
根本就不需要排序。直接就是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
相关推荐
点赞 评论 收藏
分享
09-11 17:25
浙江工商大学 游戏测试 点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 你现在会用到哪些AI技能? #
5556次浏览 79人参与
# 蚂蚁求职进展汇总 #
123026次浏览 1163人参与
# 未岚大陆求职进展汇总 #
7080次浏览 83人参与
# 秋招踩过的“雷”,希望你别再踩 #
83418次浏览 1072人参与
# 你还有多少年退休? #
26701次浏览 192人参与
# 大厂VS公务员你怎么选 #
26680次浏览 390人参与
# 平安产险科技校招 #
671次浏览 0人参与
# 我对___祛魅了 #
132193次浏览 736人参与
# 我的求职进度条 #
87793次浏览 1162人参与
# 实习在多还是在精 #
34636次浏览 241人参与
# 实习下班不想学习,正常吗? #
19722次浏览 173人参与
# 小马智行求职进展汇总 #
13513次浏览 49人参与
# 你的房租占工资的比例是多少? #
64701次浏览 797人参与
# 你见过哪些工贼行为 #
16365次浏览 90人参与
# 校招谈薪一定要知道的事 #
13117次浏览 113人参与
# 金蝶求职进展汇总 #
53856次浏览 263人参与
# 找工作中的小确幸 #
26586次浏览 275人参与
# 总结:哪家公司面试体验感最好 #
70104次浏览 416人参与
# 顺丰求职进展汇总 #
63310次浏览 314人参与
# 反问环节如何提问 #
115274次浏览 2460人参与
# 非技术岗投递进展 #
157888次浏览 1314人参与
# 你觉得材料多少算高薪 #
26082次浏览 159人参与