根本就不需要排序。直接就是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

相关推荐

牛客热帖

牛客网
牛客企业服务