이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |