提出 #4839659
ソースコード 拡げる
#include <bits/stdc++.h>
using namespace std;
using VS = vector<string>; using LL = long long;
using VI = vector<int>; using VVI = vector<VI>;
using PII = pair<int, int>; using PLL = pair<LL, LL>;
using VL = vector<LL>; using VVL = vector<VL>;
#define ALL(a) begin((a)),end((a))
#define RALL(a) (a).rbegin(), (a).rend()
#define SZ(a) int((a).size())
#define SORT(c) sort(ALL((c)))
#define RSORT(c) sort(RALL((c)))
#define UNIQ(c) (c).erase(unique(ALL((c))), end((c)))
#define FOR(i, s, e) for (int(i) = (s); (i) < (e); (i)++)
#define FORR(i, s, e) for (int(i) = (s); (i) > (e); (i)--)
//#pragma GCC optimize ("-O3")
#ifdef YANG33
#include "mydebug.hpp"
#else
#define DD(x)
#endif
const int INF = 1e9; const LL LINF = 1e16;
const LL MOD = 1000000007; const double PI = acos(-1.0);
/* ----- 2019/04/06 Problem: ABC 032 D / Link: http://abc032.contest.atcoder.jp/tasks/abc032_d ----- */
int main() {
cin.tie(0);
ios_base::sync_with_stdio(false);
LL N, W; cin >> N >> W;
vector<LL> v(N), w(N);
for (int i = 0; i < N; ++i) {
cin >> v[i] >> w[i];
}
auto chmin = [](LL &a, const LL b) {
a = min(a, b);
};
auto chmax = [](LL& a, const LL b) {
a = max(a, b);
};
LL ans = 0;
if (N <= 30) {
int n1 = N / 2;
vector<PLL>se;
FOR(s, 0, 1 << n1) {
LL vsum = 0, wsum = 0;
FOR(i, 0, n1) {
if (s & 1 << i) {
vsum += v[i];
wsum += w[i];
}
}
se.push_back(PLL(wsum, vsum));
}
SORT(se);
// vの昇順でないものは削除
vector<PLL>new_se; new_se.push_back(se.front());
for (auto it : se) {
if (new_se.back().second < it.second) {
new_se.push_back(it);
}
}
int n2 = N - n1;
FOR(s, 0, 1 << n2) {
LL vsum = 0, wsum = 0;
FOR(j, 0, n2) {
if (s & 1 << j) {
int i = j + n1;
vsum += v[i];
wsum += w[i];
}
}
// W-wsum以下の集合のうち,最大値をもつvsum'を検索
{
auto it = lower_bound(ALL(new_se), PLL(W - wsum + 1, -LINF));
if (it != new_se.begin()) {
it--;
ans = max(ans, vsum + it->second);
}
}
}
}
else if (*max_element(ALL(w)) <= 1000) {
// vmaxのdp
const int dpsz = accumulate(ALL(w), 0LL);
VL dp(dpsz + 1, -1);
dp[0] = 0;
FOR(i, 0, N) {
VL nx = dp;
FOR(ww, 0, dpsz - w[i] + 1) {
if (dp[ww] != -1) {
chmax(nx[ww + w[i]], dp[ww] + v[i]);
}
}
nx.swap(dp);
}
LL ret = 0;
FOR(i, 0, min((LL)dpsz, W) + 1) {
chmax(ret, dp[i]);
}
ans = ret;
}
else
{ // max v <= 1000
// 価値がv*nのうち,最小の重さdp
const int dpsz = accumulate(ALL(v), 0LL);
VL dp(dpsz + 1, LINF);
dp[0] = 0;
FOR(i, 0, N) {
VL nx = dp;
FOR(vv, 0, dpsz - v[i] + 1) {
if (dp[vv] == LINF)continue;
chmin(nx[vv + v[i]], dp[vv] + w[i]);
}
nx.swap(dp);
}
LL ret = 0;
FOR(i, 0, dpsz + 1) {
if (dp[i] <= W) {
ret = i;
}
}
ans = ret;
}
cout << (ans) << "\n";
return 0;
}
提出情報
| 提出日時 |
|
| 問題 |
D - ナップサック問題 |
| ユーザ |
Yang33 |
| 言語 |
C++14 (GCC 5.4.1) |
| 得点 |
100 |
| コード長 |
3099 Byte |
| 結果 |
AC |
| 実行時間 |
39 ms |
| メモリ |
1984 KiB |
ジャッジ結果
| セット名 |
Sample |
Subtask1 |
Subtask2 |
Subtask3 |
| 得点 / 配点 |
0 / 0 |
34 / 34 |
33 / 33 |
33 / 33 |
| 結果 |
|
|
|
|
| セット名 |
テストケース |
| Sample |
subtask00_sample_1.txt, subtask00_sample_2.txt, subtask00_sample_3.txt, subtask00_sample_4.txt |
| Subtask1 |
subtask01_0.txt, subtask01_1.txt, subtask01_10.txt, subtask01_11.txt, subtask01_12.txt, subtask01_13.txt, subtask01_14.txt, subtask01_2.txt, subtask01_3.txt, subtask01_4.txt, subtask01_5.txt, subtask01_6.txt, subtask01_7.txt, subtask01_8.txt, subtask01_9.txt, subtask00_sample_1.txt, subtask00_sample_2.txt, subtask00_sample_3.txt, subtask00_sample_4.txt |
| Subtask2 |
subtask02_0.txt, subtask02_1.txt, subtask02_10.txt, subtask02_11.txt, subtask02_12.txt, subtask02_13.txt, subtask02_14.txt, subtask02_2.txt, subtask02_3.txt, subtask02_4.txt, subtask02_5.txt, subtask02_6.txt, subtask02_7.txt, subtask02_8.txt, subtask02_9.txt, subtask00_sample_1.txt, subtask00_sample_3.txt |
| Subtask3 |
subtask03_0.txt, subtask03_1.txt, subtask03_10.txt, subtask03_11.txt, subtask03_2.txt, subtask03_3.txt, subtask03_4.txt, subtask03_5.txt, subtask03_6.txt, subtask03_7.txt, subtask03_8.txt, subtask03_9.txt, subtask00_sample_1.txt, subtask00_sample_4.txt |
| ケース名 |
結果 |
実行時間 |
メモリ |
| subtask00_sample_1.txt |
AC |
1 ms |
256 KiB |
| subtask00_sample_2.txt |
AC |
7 ms |
892 KiB |
| subtask00_sample_3.txt |
AC |
1 ms |
256 KiB |
| subtask00_sample_4.txt |
AC |
1 ms |
256 KiB |
| subtask01_0.txt |
AC |
8 ms |
892 KiB |
| subtask01_1.txt |
AC |
8 ms |
892 KiB |
| subtask01_10.txt |
AC |
7 ms |
892 KiB |
| subtask01_11.txt |
AC |
7 ms |
892 KiB |
| subtask01_12.txt |
AC |
7 ms |
892 KiB |
| subtask01_13.txt |
AC |
7 ms |
892 KiB |
| subtask01_14.txt |
AC |
7 ms |
892 KiB |
| subtask01_2.txt |
AC |
7 ms |
892 KiB |
| subtask01_3.txt |
AC |
8 ms |
892 KiB |
| subtask01_4.txt |
AC |
6 ms |
892 KiB |
| subtask01_5.txt |
AC |
6 ms |
892 KiB |
| subtask01_6.txt |
AC |
6 ms |
892 KiB |
| subtask01_7.txt |
AC |
7 ms |
892 KiB |
| subtask01_8.txt |
AC |
7 ms |
892 KiB |
| subtask01_9.txt |
AC |
7 ms |
892 KiB |
| subtask02_0.txt |
AC |
38 ms |
1920 KiB |
| subtask02_1.txt |
AC |
38 ms |
1920 KiB |
| subtask02_10.txt |
AC |
38 ms |
1920 KiB |
| subtask02_11.txt |
AC |
36 ms |
1888 KiB |
| subtask02_12.txt |
AC |
37 ms |
1896 KiB |
| subtask02_13.txt |
AC |
1 ms |
256 KiB |
| subtask02_14.txt |
AC |
35 ms |
1792 KiB |
| subtask02_2.txt |
AC |
38 ms |
1936 KiB |
| subtask02_3.txt |
AC |
36 ms |
1792 KiB |
| subtask02_4.txt |
AC |
37 ms |
1900 KiB |
| subtask02_5.txt |
AC |
35 ms |
1816 KiB |
| subtask02_6.txt |
AC |
38 ms |
1920 KiB |
| subtask02_7.txt |
AC |
37 ms |
1896 KiB |
| subtask02_8.txt |
AC |
38 ms |
1920 KiB |
| subtask02_9.txt |
AC |
37 ms |
1892 KiB |
| subtask03_0.txt |
AC |
39 ms |
1984 KiB |
| subtask03_1.txt |
AC |
37 ms |
1896 KiB |
| subtask03_10.txt |
AC |
37 ms |
1888 KiB |
| subtask03_11.txt |
AC |
1 ms |
256 KiB |
| subtask03_2.txt |
AC |
36 ms |
1824 KiB |
| subtask03_3.txt |
AC |
36 ms |
1792 KiB |
| subtask03_4.txt |
AC |
37 ms |
1888 KiB |
| subtask03_5.txt |
AC |
36 ms |
1792 KiB |
| subtask03_6.txt |
AC |
37 ms |
1888 KiB |
| subtask03_7.txt |
AC |
36 ms |
1800 KiB |
| subtask03_8.txt |
AC |
34 ms |
1736 KiB |
| subtask03_9.txt |
AC |
37 ms |
1920 KiB |