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é!
#include <bits/stdc++.h>
#define ll long long
#define str string
#define input freopen("SIEUNT.INP","r",stdin);
#define output freopen("SIEUNT.OUT","w",stdout);
#define FAST ios::sync_with_stdio(false); cin.tie(nullptr);
using namespace std;
int main() {
FAST
ll n,w;
cin>>n>>w;
vector<ll> dp(w+1,0);
while (n--) {
ll wi,vi,bi,ai;
cin>>wi>>vi>>bi>>ai;
for (ll i=w;i>=wi;--i) {
ll res=dp[i];
for (ll j=1;j*wi<=i;++j) {
ll ans=j*vi-ai*(j*j)+(j>0 ? bi:0);
res=max(res,dp[i-j*wi]+ans);
}
dp[i]=res;
}
}
cout<<dp[w]<<"\n";
return 0;
}
Hãy giúp mọi người biết câu trả lời này thế nào?
#include <bits/stdc++.h>
#define ll long long
#define str string
#define FAST ios::sync_with_stdio(0);cin.tie(0);
#define MAXN 1000000
#define INPUT freopen("VIDU.INP","r",stdin);
#define OUTPUT freopen("VIDU.OUT","w",stdout);
using namespace std;
ll dp[3001];
int main() {
FAST
ll n,m,t1,t2,t3,t4;
cin>>n>>m;
while (n--) {
cin>>t1>>t2>>t3>>t4;
for (ll i=m;i>=t1;i--)
for (ll j=1;j*t1<=i;j++)
dp[i]=max(dp[i],dp[i-j*t1]+j*t2-t4*j*j+(j>0)*t3);
}
cout<<dp[m];
return 0;
}
Hãy giúp mọi người biết câu trả lời này thế nào?
Bảng tin