結果

問題 No.2869 yuusaan's Knapsacks
ユーザー vjudge1vjudge1
提出日時 2024-09-12 12:30:11
言語 C++23
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 26 ms / 4,500 ms
コード長 1,776 bytes
コンパイル時間 3,290 ms
コンパイル使用メモリ 251,292 KB
実行使用メモリ 11,572 KB
最終ジャッジ日時 2024-09-12 12:30:16
合計ジャッジ時間 5,019 ms
ジャッジサーバーID
(参考情報)
judge1 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
6,944 KB
testcase_01 AC 2 ms
6,944 KB
testcase_02 AC 3 ms
7,620 KB
testcase_03 AC 10 ms
9,032 KB
testcase_04 AC 10 ms
9,192 KB
testcase_05 AC 3 ms
6,940 KB
testcase_06 AC 26 ms
11,428 KB
testcase_07 AC 12 ms
9,032 KB
testcase_08 AC 4 ms
6,940 KB
testcase_09 AC 5 ms
7,236 KB
testcase_10 AC 17 ms
11,336 KB
testcase_11 AC 8 ms
9,032 KB
testcase_12 AC 23 ms
11,164 KB
testcase_13 AC 8 ms
8,904 KB
testcase_14 AC 14 ms
9,156 KB
testcase_15 AC 13 ms
9,224 KB
testcase_16 AC 14 ms
8,944 KB
testcase_17 AC 26 ms
11,572 KB
testcase_18 AC 24 ms
11,084 KB
testcase_19 AC 18 ms
11,108 KB
testcase_20 AC 5 ms
7,112 KB
testcase_21 AC 18 ms
11,176 KB
testcase_22 AC 18 ms
11,400 KB
testcase_23 AC 9 ms
8,468 KB
testcase_24 AC 23 ms
9,076 KB
testcase_25 AC 7 ms
8,412 KB
testcase_26 AC 18 ms
9,288 KB
testcase_27 AC 2 ms
7,500 KB
testcase_28 AC 26 ms
11,560 KB
testcase_29 AC 26 ms
11,560 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include<bits/stdc++.h>

using namespace std;

const int N = 20;
const long long INF = 5e10;
const int M = (1 << 16) + 5;

bool dp[N][M];
int n, m, v[N], w[N], b[M], p[M], pre[N][M];
long long a[N], maxx[M], numw[M], numv[M];

inline int lowbit(int x){
  return x & (-x);
}

void print(int x, int state){
  if(!x) return ;
  print(x - 1, state - pre[x][state]);
  vector<int> ans;
  for(int i = pre[x][state]; i; i -= lowbit(i)) ans.push_back(b[lowbit(i)]);
  cout << ans.size() << ' ';
  sort(ans.begin(), ans.end());
  for(int v : ans) cout << v + 1 << ' ';
  cout << '\n';
}

void Solve(int x){
  for(int i = 0; i < (1 << m); i++) maxx[i] = -INF, p[i] = 0;
  for(int i = 0; i < (1 << m); i++){
    if(dp[x][i]) maxx[i] = max(maxx[i], a[x + 1]);
  }
  for(int i = 0; i < m; i++){
    for(int j = 0; j < (1 << m); j++){
      if(!((j >> i) & 1) && maxx[j + (1 << i)] < maxx[j] - w[i]){
        maxx[j + (1 << i)] = maxx[j] - w[i];
        p[j + (1 << i)] = p[j] + (1 << i);
      }
    }
  }
}

int main(){
  cin >> n >> m;
  for(int i = 1; i <= n; i++) cin >> a[i];
  for(int i = 0; i < m; i++){
    cin >> v[i] >> w[i];
    b[(1 << i)] = i;
  }
  for(int i = 1; i < (1 << m); i++){
    numw[i] = numw[i - lowbit(i)] + w[b[lowbit(i)]];
    numv[i] = numv[i - lowbit(i)] + v[b[lowbit(i)]];
  }
  for(int i = 0; i <= n; i++){
    for(int j = 0; j < (1 << m); j++) dp[i][j] = 0;
  }
  dp[0][0] = 1;
  for(int i = 1; i <= n; i++){
    Solve(i - 1);
    for(int j = 0; j < (1 << m); j++){
      dp[i][j] |= dp[i - 1][j];
      if(!dp[i][j] && maxx[j] >= 0){
        dp[i][j] = 1;
        pre[i][j] = p[j];
      }
    }
  }
  int h = 0;
  for(int j = 1; j < (1 << m); j++){
    if(dp[n][j] && numv[j] > numv[h]) h = j;
  }
  cout << numv[h] << '\n';
  print(n, h);
  return 0;
}
0