結果
| 問題 |
No.2869 yuusaan's Knapsacks
|
| コンテスト | |
| ユーザー |
vjudge1
|
| 提出日時 | 2024-09-12 12:34:34 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,277 bytes |
| コンパイル時間 | 1,003 ms |
| コンパイル使用メモリ | 96,228 KB |
| 実行使用メモリ | 13,156 KB |
| 最終ジャッジ日時 | 2024-09-12 12:34:50 |
| 合計ジャッジ時間 | 16,225 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 23 WA * 4 |
ソースコード
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int MAXN = (1 << 16);
int n, m, k, ans, a[20], val[MAXN], w[MAXN], dp[20][MAXN], p[20][MAXN];
void Out(int x, int u) {
if (!x) return ;
Out(x - 1, u ^ p[x][u]);
vector<int> out;
for (int i = 0; i < m; i++) {
if ((p[x][u] >> i) & 1) {
out.push_back(i + 1);
}
}
cout << out.size() << ' ';
for (auto u : out) cout << u << ' ';
cout << '\n';
}
int main() {
ios::sync_with_stdio(0), cin.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = 0, x, y; i < m; i++) {
cin >> x >> y;
for (int j = 0; j < (1 << m); j++) {
val[j] += x * ((j >> i) & 1);
w[j] += y * ((j >> i) & 1);
}
}
for (int i = 1; i <= n; i++) {
for (int j = 0; j < (1 << m); j++) {
for (int k = j; ; k = (k - 1) & j) {
if (w[k] <= a[i] && dp[i][j] < dp[i - 1][j ^ k] + val[k]) {
dp[i][j] = dp[i - 1][j ^ k] + val[k], p[i][j] = k;
}
if (!k) break;
}
}
}
for (int i = 0; i < (1 << m); i++){
ans = max(ans, dp[n][i]);
}
cout << ans << '\n';
for (int i = 0; i < (1 << m); i++) {
if (ans == dp[n][i]) {
Out(n, i);
return 0;
}
}
return 0;
}
vjudge1