結果
| 問題 |
No.2364 Knapsack Problem
|
| コンテスト | |
| ユーザー |
tnakao0123
|
| 提出日時 | 2023-07-05 16:17:56 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 53 ms / 3,000 ms |
| コード長 | 1,532 bytes |
| コンパイル時間 | 274 ms |
| コンパイル使用メモリ | 44,364 KB |
| 実行使用メモリ | 35,328 KB |
| 最終ジャッジ日時 | 2024-07-19 10:30:27 |
| 合計ジャッジ時間 | 1,612 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 20 |
ソースコード
/* -*- coding: utf-8 -*-
*
* 2364.cc: No.2364 Knapsack Problem - yukicoder
*/
#include<cstdio>
#include<algorithm>
using namespace std;
/* constant */
const int MAX_N = 7;
const int MAX_M = 7;
const int MAX_K = MAX_N + MAX_M;
const int KBITS = 1 << MAX_K;
const int MAX_W = 500;
/* typedef */
/* global variables */
int as[MAX_N], bs[MAX_N], cs[MAX_M], ds[MAX_M];
int es[MAX_K], fs[MAX_K], dp[KBITS][MAX_W + 1];
/* subroutines */
void setmax(int &a, int b) { if (a < b) a = b; }
/* main */
int main() {
int n, m, w;
scanf("%d%d%d", &n, &m, &w);
for (int i = 0; i < n; i++) scanf("%d", as + i);
for (int i = 0; i < n; i++) scanf("%d", bs + i);
for (int i = 0; i < m; i++) scanf("%d", cs + i);
for (int i = 0; i < m; i++) scanf("%d", ds + i);
int k = n + m;
copy(as, as + n, es);
for (int i = 0; i < m; i++) es[i + n] = -cs[i];
copy(bs, bs + n, fs);
for (int i = 0; i < m; i++) fs[i + n] = -ds[i];
int kbits = 1 << k;
for (int bits = 0; bits < kbits; bits++)
fill(dp[bits], dp[bits] + w + 1, -1);
dp[0][0] = 0;
for (int bits = 0; bits < kbits; bits++)
for (int i = 0, bi = 1; i < k; i++, bi <<= 1)
if (! (bits & bi)) {
int minj = max(0, -es[i]), maxj = min(w, w - es[i]);
for (int j = minj; j <= maxj; j++)
if (dp[bits][j] >= 0)
setmax(dp[bits | bi][j + es[i]], dp[bits][j] + fs[i]);
}
int maxd = 0;
for (int bits = 0; bits < kbits; bits++)
for (int j = 0; j <= w; j++)
maxd = max(maxd, dp[bits][j]);
printf("%d\n", maxd);
return 0;
}
tnakao0123