제출 #1326911

#제출 시각아이디문제언어결과실행 시간메모리
1326911DvcMinhKnapsack (NOI18_knapsack)C++20
100 / 100
60 ms45624 KiB
// vegnim
#include <bits/stdc++.h>
using namespace std;
typedef unsigned int ui;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair <int,int> pii;
typedef pair <ll,ll> pll;
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define setpre(n) fixed << setprecision(n)
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
#define mask(n) (1LL << (n))
#define getbit(x, b) (((x) >> (b)) & 1)
#define FOR(i, a, b) for (int i = (a); i <= (b); i++)
#define FORd(i, a, b) for (int i = (a); i >= (b); i--)
#define REP(i, n) for (int i = 0; i < (n); i++)
#define task ""
#define dbg if (DEBUG_MODE)
const bool DEBUG_MODE = 0;

const int maxN = 1e5+5, maxS = 2005;

int s,n,v[maxN],w[maxN],k[maxN];

namespace sub1
{
  void solve()
  {
    ll ans = 0;
    while (k[1]-- && s - w[1] >= 0){
      ans += v[1];
      s -= w[1];
    }
    cout << ans;
  }
}

namespace sub2
{
  const int maxN = 105;

  int dp[maxN][maxS];

  void solve()
  {
    FOR(i, 1, n){
      FOR(j, 0, s){
        dp[i][j] = dp[i-1][j];
        if (j >= w[i]) dp[i][j] = max(dp[i][j], v[i] + dp[i-1][j-w[i]]);
      }
    }
    cout << dp[n][s];
  }
}

namespace sub3
{
  const int maxN = 1e3+5;

  int dp[maxN][maxS];

  void solve()
  {
    int m = n;
    FOR(i, 1, n){
      REP(j, k[i]-1){
        m++;
        v[m] = v[i];
        w[m] = w[i];
      }
    }
    n = m;
    FOR(i, 1, n){
      FOR(j, 0, s){
        dp[i][j] = dp[i-1][j];
        if (j >= w[i]) dp[i][j] = max(dp[i][j], v[i] + dp[i-1][j-w[i]]);
      }
    }
    cout << dp[n][s];
  }
}

namespace sub4
{
  const int maxN = 4000;

  ll wt[maxN],val[maxN],dp[maxN][maxS];

  void solve()
  {
    int m = 0;
    FOR(i, 1, n){
      for (int j=0; (1 << j) <= k[i]; j++){
        m++;
        wt[m] = (1LL << j) * w[i];
        val[m] = (1LL << j) * v[i];
        k[i] -= (1 << j);
      }
      if (k[i]){
        m++;
        wt[m] = 1LL*k[i] * w[i];
        val[m] = 1LL*k[i] * v[i];
      }
    }
    n = m;
    FOR(i, 1, n){
      FOR(j, 0, s){
        dp[i][j] = dp[i-1][j];
        if (j >= wt[i]) dp[i][j] = max(dp[i][j], val[i] + dp[i-1][j-wt[i]]);
      }
    }
    cout << dp[n][s];
  }
}

namespace sub5
{
  vector<vector<pii>> item;
  ll dp[maxS][maxS];

  void solve()
  {
    item.assign(s+1, vector<pii> {});
    FOR(i, 1, n){
      item[w[i]].pb({v[i], k[i]});
    }
    FOR(i, 1, s){
      sort(all(item[i]), greater<pii>());
    }
    dbg{
      FOR(i, 1, s){
        if (item[i].empty()) continue;
        cout << i<<": ";
        for (auto x : item[i]){
          cout << x.fi<<','<<x.se<<' ';
        }
        cout<<'\n';
      }
    }
    FOR(i, 1, s){
      FOR(j, 0, s){
        dbg cout << "?? "<<i<<','<<j<<'\n';
        dp[i][j] = dp[i-1][j];
        ll sumval = 0;
        int sumw = 0;
        int p = 0, itemcnt = 0;
        while (p < sz(item[i])){
          if (item[i][p].se - itemcnt <= 0){
            p++;
            itemcnt = 0;
            continue;
          }
          if (j < sumw + i){
            break;
          }
          sumw += i;
          sumval += item[i][p].fi;
          itemcnt++;
          dp[i][j] = max(dp[i][j], sumval + dp[i-1][j - sumw]);
          dbg cout << "update with val "<<sumval<<" at "<<i<<','<<j<<" w "<<sumw<<'\n';
        }
      }
    }
    dbg{
      cout << dp[1][1]<<'\n';
    }
    cout << dp[s][s];
  }
}

signed main()
{
  ios_base::sync_with_stdio(NULL); cin.tie(nullptr);
  // freopen("inp.txt","r",stdin);
  cin >> s >> n;
  bool issub2 = (n <= 100);
  bool issub3 = (n <= 100);
  bool issub4 = (n <= 100);
  FOR(i, 1, n){
    cin >> v[i] >> w[i] >> k[i];
    if (k[i] != 1) issub2 = 0;
    if (k[i] > 10) issub3 = 0;
  }
  if (n == 1){
    sub1::solve();
    return 0;
  }
  if (issub2){
    sub2::solve();
    return 0;
  }
  if (issub3){
    sub3::solve();
    return 0;
  }
  if (issub4){
    sub4::solve();
    return 0;
  }
  sub5::solve();
  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...