关注
根本就不需要排序。直接就是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-13 10:40
门头沟学院 Java 点赞 评论 收藏
分享
点赞 评论 收藏
分享
09-02 13:06
西安电子科技大学 嵌入式软件开发 点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 秋招报数:你投了多少家公司? #
5175次浏览 25人参与
# 荣耀求职进展汇总 #
934230次浏览 4969人参与
# 小红书校招直播来了 #
67409次浏览 405人参与
# 非技术er求职现状 #
94612次浏览 628人参与
# 数据人offer决赛圈怎么选 #
240849次浏览 2360人参与
# 总结:哪家公司最喜欢泡池子 #
137136次浏览 479人参与
# 国庆前的秋招小结 #
145883次浏览 1177人参与
# 百度工作体验 #
258169次浏览 2081人参与
# 这些公司卡简历很严格 #
50780次浏览 243人参与
# 设计人的面试记录 #
147389次浏览 1452人参与
# 我的第一份实习怎么找的 #
149019次浏览 1371人参与
# 摸鱼打卡站 #
53721次浏览 733人参与
# 我和mentor的爱恨情仇 #
71645次浏览 415人参与
# 多益网络求职进展汇总 #
38407次浏览 171人参与
# bilibili求职进展汇总 #
76224次浏览 698人参与
# 查收我的offer竞争力报告 #
207078次浏览 1358人参与
# kpi面有什么特征 #
75197次浏览 457人参与
# 字节跳动工作体验 #
511474次浏览 5162人参与
# 牛客十周岁生日快乐 #
171816次浏览 1792人参与
# 选了这个offer,你有没有后悔? #
617456次浏览 4076人参与
# 这个工作能去吗 #
17417次浏览 120人参与