結果
| 問題 |
No.2869 yuusaan's Knapsacks
|
| コンテスト | |
| ユーザー |
vjudge1
|
| 提出日時 | 2024-09-12 10:47:45 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 1,128 ms / 4,500 ms |
| コード長 | 1,415 bytes |
| コンパイル時間 | 3,098 ms |
| コンパイル使用メモリ | 251,000 KB |
| 実行使用メモリ | 16,640 KB |
| 最終ジャッジ日時 | 2024-09-12 10:48:04 |
| 合計ジャッジ時間 | 17,630 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 27 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
const int N = 20;
const long long INF = 5e10;
const int M = (1 << 16) + 5;
int n, m, a[N], v[N], w[N], b[M], pre[N][M];
long long dp[N][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';
}
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] = -INF;
}
dp[0][0] = 0;
for(int i = 1; i <= n; i++){
dp[i][0] = 0;
for(int j = 1; j < (1 << m); j++){
dp[i][j] = max(dp[i][j], dp[i - 1][j]);
for(int k = j; k; k = (k - 1) & j){
if(numw[k] <= a[i] && dp[i - 1][j - k] + numv[k] > dp[i][j]){
pre[i][j] = k, dp[i][j] = dp[i - 1][j - k] + numv[k];
}
}
}
}
int h = max_element(dp[n], dp[n] + (1 << m)) - dp[n];
cout << dp[n][h] << '\n';
print(n, h);
return 0;
}
vjudge1