#include <bits/stdc++.h>
#define fast ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define pub push_back
#define pob pop_back
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
const ll Max=1e5+5,D=2e3+5;
ll W,n;
ll dp[Max],app[Max],c[Max],w[Max];
void sub1()
{
ll i,j,k,cnt,ans;
cnt=min(W/w[1],app[1]);
ans=c[1]*cnt;
cout<<ans;
return;
}
void sub234()
{
ll i,j,k,cnt,ans;
for(i=1;i<=n;++i)
{
cnt=min(W/w[i],app[i]);
for(k=1;k<=cnt;++k)
{
for(j=W;j>=w[i];--j)
dp[j]=max(dp[j],dp[j-w[i]]+c[i]);
}
}
/*for(i=1;i<=n;++i)
cout<<dp[i]<<" ";
cout<<"\n";*/
cout<<dp[W];
return;
}
void sub5()
{
///Nhận thấy với mỗi w[i] thì chỉ lấy tối đa được W/w[i] đồ như vậy, áp dụng ý tưởng này + tham lam: sort sao cho cùng w[i] thì c[i] max, sau đó làm tương tự sub 2,3,4, chú ý biến đổi app[i] theo từng lượt for
ll i,j,k,cnt,ans,id;
vector<pll> Do[D];
for(i=1;i<=n;++i)
{
if(w[i]>=D) continue;
Do[w[i]].pub({c[i],app[i]});
}
for(i=1;i<=W;++i)
{
if(Do[i].empty()) continue;
sort(Do[i].begin(),Do[i].end(),greater<pll>());
id=0;
for(k=1;k<=W/i;++k)
{
if(id>Do[i].size()) break;
for(j=W;j>=i;--j)
dp[j]=max(dp[j],dp[j-i]+Do[i][id].fi);
--Do[i][id].se;
if(!Do[i][id].se) ++id;
}
}
cout<<dp[W];
return;
}
int main()
{
fast
memset(dp,0,sizeof(dp));
ll i,j,k,cnt,ans;
cin>>W>>n;
for(i=1;i<=n;++i)
cin>>c[i]>>w[i]>>app[i];
if(n==1)
{
sub1();
return 0;
}
if(n<=100)
{
sub234();
return 0;
}
sub5();
return 0;
}
# | 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... |