关注
根本就不需要排序。直接就是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
相关推荐
03-11 14:23
南阳理工学院 Java 点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 春招/暑实第一面是哪家? #
29193次浏览 307人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
6213次浏览 32人参与
# 巨人网络春招 #
10883次浏览 164人参与
# 腾讯音乐求职进展汇总 #
159919次浏览 1100人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
185640次浏览 1103人参与
# 小红书求职进展汇总 #
226278次浏览 1351人参与
# MiniMax求职进展汇总 #
21143次浏览 273人参与
# 硬件人秋招的第一个offer #
122272次浏览 1453人参与
# 实习到现在,你最困惑的一个问题 #
31160次浏览 271人参与
# 如果重来一次你还会读研吗 #
228970次浏览 2009人参与
# 网易游戏笔试 #
6062次浏览 83人参与
# 职能管理面试记录 #
10379次浏览 57人参与
# 把自己当AI,现在最消耗你token的问题是什么? #
6091次浏览 151人参与
# 正在春招的你,也参与了去年秋招吗? #
361658次浏览 2628人参与
# 硬件应届生薪资是否普遍偏低? #
108122次浏览 601人参与
# 简历中的项目经历要怎么写? #
308399次浏览 4094人参与
# 工作中遇到的歹人 #
96261次浏览 535人参与
# 我的AI电子员工 #
34087次浏览 223人参与
# 校招笔试 #
461171次浏览 2943人参与
# AI时代,哪些岗位最容易被淘汰 #
60793次浏览 640人参与
# 你怎么看待AI面试 #
178387次浏览 1081人参与
# 如何一边实习一边找下家? #
40063次浏览 349人参与
查看12道真题和解析