Submission #1273613

#TimeUsernameProblemLanguageResultExecution timeMemory
127361344100Knapsack (NOI18_knapsack)C++20
73 / 100
116 ms5816 KiB
#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 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...