提出 #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
結果
AC × 4
AC × 19
AC × 17
AC × 14
セット名 テストケース
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