help me pls now
Trong vương quốc Eldoria, có một truyền thuyết về Kho báu của Thời Đại – một kho báu chứa đựng vô số vật phẩm quý giá nằm rải rác khắp vùng đất thần thoại. Những vật phẩm này không chỉ có giá trị riêng biệt, mà còn ẩn chứa những hiệu ứng đặc biệt khi được thu thập với số lượng khác nhau.
Bạn nhận ra có N loại bảo vật khác nhau, với số lượng bảo vật của mỗi loại là vô hạn. Tuy nhiên, khối lượng bảo vật bạn có thể thu thập không thể vượt quá W.
Người chơi vào vai một nhà thám hiểm tài ba đang trên đường khám phá kho báu này. Tuy nhiên, việc thu thập bảo vật không hề đơn giản. Mỗi loại bảo vật i có các thông số:
Giả sử bạn thu thập pi món bảo vật của loại i, giá trị bạn nhận từ loại i là: pi∗vi−ai∗(pi2)+bi∗[pi>0] Ở đây, biểu thức [pi>0] trả về 1 nếu (pi>0), ngược lại sẽ trả về 0.
Mục tiêu của bạn là thu thập được bộ sưu tập bảo vật có tổng giá trị cao nhất, mà không làm quá tải túi đồ của mình. Hãy tính toán và lựa chọn một cách thông minh để tối ưu hóa phần thưởng trong hành trình này!
Input
Dòng đầu tiên hai số nguyên dương N và W là số loại bảo vật và tổng cân nặng tối đa của các bảo vật bạn có thể thu thập.
N dòng tiếp theo, mỗi dòng chứa lần lượt bốn số nguyên wi, vi, bi, ai thể hiện các thông số của bảo vật loại i.
Output
Example
Sample Input 1
Copy1 20 5 20 5 3
Sample Output 1
Copy38
Sample Input 2
Copy3 10 5 6 2 3 2 4 2 1 5 2 3 2
Sample put 2
11
làm c++
Bài thu thập kho báu đảm bảo w_i > 0 với mọi i
Subtask 2 bài Thu Thập Kho Báu có n, W <= 3000
Hãy luôn nhớ cảm ơn và vote 5*
nếu câu trả lời hữu ích nhé!
Đáp án:
#xDuyHoangg
#include <bits/stdc++.h>
using namespace std;
const int MAX_W = 3001; // W tối đa
long long dp[MAX_W];
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N, W;
cin >> N >> W;
vector<int> w(N), v(N), b(N), a(N);
for (int i = 0; i < N; i++) {
cin >> w[i] >> v[i] >> b[i] >> a[i];
}
// Khởi tạo dp với giá trị nhỏ
fill(dp, dp + W + 1, LLONG_MIN);
dp[0] = 0;
// Xử lý từng loại bảo vật
for (int i = 0; i < N; i++) {
for (int weight = W; weight >= 0; weight--) {
for (int p = 1; p * w[i] <= weight; p++) {
long long value = p * v[i] - a[i] * (p * p) + (p > 0 ? b[i] : 0);
dp[weight] = max(dp[weight], dp[weight - p * w[i]] + value);
}
}
}
// Kết quả lớn nhất có thể đạt được
long long result = 0;
for (int i = 0; i <= W; i++) {
result = max(result, dp[i]);
}
cout << result << '\n';
return 0;
}
Giải thích các bước giải:
dp[w]
lưu giá trị tối đa đạt được với khối lượng w
.p
sao cho tổng khối lượng không vượt quá W
.p
, cập nhật dp[w]
nếu giá trị cao hơn.dp[0] -> dp[W]
.Hãy giúp mọi người biết câu trả lời này thế nào?
Xem thêm:
Bảng tin