제출 #837186

#제출 시각아이디문제언어결과실행 시간메모리
837186rinhoKnapsack (NOI18_knapsack)C++14
100 / 100
70 ms35024 KiB
#include<bits/stdc++.h> using namespace std; const int Nmax = 2000; const int MOD = 1000000007; const long long INF = 1e18 + 7; int maxwei, n; vector<pair<int, int>> weight[Nmax + 3]; long long dp[Nmax + 3][Nmax + 3]; bool cmp(pair<int, int> x, pair<int, int> y){ return x.first > y.first; } void in(){ cin >> maxwei >> n; for(int i = 1; i <= n; i++){ int val, wei, cnt; cin >> val >> wei >> cnt; weight[wei].push_back({val, cnt}); } } void sol(){ //dp[i][w] là giá trị lớn nhất có thể đạt đc khi xét đến i đồ vật đầu tiên và sử dụng w khối lượng memset(dp, -0x3f, sizeof dp); dp[0][0] = 0; int i = 1; // bản chất i giống curwei nhưng vì có những curwei trống ko sử dụng nên nếu curwei có sử dụng thì sẽ tăng biến i lên 1 long long ans = -INF; for(int curwei = 1; curwei <= maxwei; curwei++){ if(weight[curwei].empty()) continue; sort(weight[curwei].begin(), weight[curwei].end(), cmp); for(int w = 0; w <= maxwei; w++){ dp[i][w] = dp[i - 1][w]; int copies = 0; // tổng số lần sử dụng các đồ vật có khối lượng curwei int j = 0; // xét đến giá trị lớn thứ j int usedthiswei = 0; // số lần sử dụng giá trị lớn thứ j long long val = 0; // tổng giá trị thu được từ các đồ vật khối lượng curwei while(((copies + 1) * curwei <= w) && j < weight[curwei].size()){ copies++; val += 0ll + weight[curwei][j].first; if(dp[i - 1][w - copies * curwei] > -INF){ dp[i][w] = max(dp[i][w], dp[i - 1][w - copies * curwei] + val); ans = max(ans, dp[i][w]); } usedthiswei++; if(usedthiswei == weight[curwei][j].second){ // vì weight[curwei][j].second lưu số lượng đồ vật mang khối lượng curwei //và có giá trị lớn thứ j nên nếu usedthiswei từ 0 cộng đến khi bằng, //thì tại thời điểm bằng chúng ta xài hết số lượng đồ của weight[curwei][j] rồi // chính vì vậy ta đổi qua giá trị lớn thứ j + 1 trong khối lượng curwei và reset biến usedthiswei = 0 usedthiswei = 0; j++; } } } i++; } cout << ans << '\n'; } int main(){ //freopen(" ", "r", stdin); //freopen(" ", "w", stdout); ios_base::sync_with_stdio(false); cin.tie(0); int t = 1; //cin >> t; while(t--){ in(); sol(); } return 0; }

컴파일 시 표준 에러 (stderr) 메시지

knapsack.cpp: In function 'void sol()':
knapsack.cpp:42:54: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   42 |             while(((copies + 1) * curwei <= w) &&  j < weight[curwei].size()){
      |                                                    ~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...