获赞
142
粉丝
84
关注
2
看过 TA
75
北京理工大学
2020
产品经理
IP属地:未知
独立全栈开发者,爱好数字媒体,乐观的北京爷们儿。
私信
关注
2019-08-06 22:22
已编辑
字节跳动_搜索_前端开发工程师
题目 给定暑假时间X天(<=1000),游戏数量N个(<=11),接下来N行给定每种游戏需要花费的天数(Ai),以及通关该游戏带来的成就点数(Bi),求:在暑假X天里能够达成的最高成就点数。 总体思路 首先对游戏进行排序(时间从短到长,价值从低到高),然后就是标准的01背包问题了。 背包问题的解决过程 在解决问题之前,为描述方便,首先定义一些变量:Vi表示第 i 个物品的价值,Wi表示第 i 个物品的体积,定义V(i,j):当前背包容量 j,前 i 个物品最佳组合对应的价值,同时背包问题抽象化(X1,X2,…,Xn,其中 Xi 取0或1,表示第 i 个物品选或不选)。 1、建立模...
墨麟非攻:根本就不需要排序。直接就是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; }
0 点赞 评论 收藏
分享
关注他的用户也关注了:
牛客网
牛客企业服务