关注
根本就不需要排序。直接就是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
相关推荐
乌卡拉卡波巴卜:投票小红书
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 你想跟着什么样领导? #
5590次浏览 82人参与
# 什么样的背景能拿SSP? #
117354次浏览 410人参与
# 百度秋招 #
56019次浏览 394人参与
# 你的秋招白月光和意难平公司 #
7183次浏览 82人参与
# 分享一个让你热爱工作的瞬间 #
47500次浏览 412人参与
# 找实习是选平台还是选业务? #
10329次浏览 147人参与
# 从夯到拉,评价编程语言 #
5085次浏览 48人参与
# 秋招签约后的心态变化 #
106125次浏览 923人参与
# 职场吐槽大会 #
289809次浏览 2111人参与
# 每个月花钱最多的地方是? #
5367次浏览 76人参与
# xxx岗位的一天 #
10129次浏览 92人参与
# 作业帮求职进展汇总 #
77720次浏览 520人参与
# 十一月总结 #
13465次浏览 146人参与
# 你面试时吹过最大的牛 #
20334次浏览 116人参与
# 为什么国企只招应届生 #
218515次浏览 1262人参与
# 饿了么求职进展汇总 #
80328次浏览 684人参与
# 非技术求职现状 #
549574次浏览 3509人参与
# 实习学到最有价值的工作习惯 #
43671次浏览 378人参与
# 韶音科技求职进展汇总 #
65053次浏览 510人参与
# AI“智障”时刻 #
6103次浏览 54人参与
# 实习生如何通过转正 #
111812次浏览 1421人参与