Submission #3768382
Source Code Expand
#include <iostream>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <vector>
#include <string>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <unordered_set>
#include <unordered_map>
#include <bitset>
#include <limits>
#include <random>
#include <complex>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cassert>
using namespace std;
#define REP(i,n) for (int i = 0; i < n; i++)
template <class T> using reversed_priority_queue = priority_queue<T, vector<T>, greater<T> >;
typedef long long ll;
ll N,W;
vector < ll > v;
vector < ll > w;
ll dp[300010];
int main ()
{
cin >> N >> W;
v.resize(N);
w.resize(N);
REP(i,N) cin >> v[i] >> w[i];
if (N <= 30) {
REP(i,30 - N) {
v.push_back(0);
w.push_back(0);
}
ll ans = 0;
map < ll, ll > wt;
REP(i,(1 << 15)) {
ll sum_w = 0;
ll sum_v = 0;
REP(j,15) {
if ((i >> j) & 1) {
sum_w += w[j];
sum_v += v[j];
}
}
if (wt.find(sum_w) == wt.end()) {
wt[sum_w] = sum_v;
} else {
wt[sum_w] = max(wt[sum_w], sum_v);
}
if (sum_w <= W) {
ans = max(ans, sum_v);
}
}
ll max_v = 0;
vector < pair < ll,ll > > cnd;
for (auto itr = wt.begin(); itr != wt.end(); itr++) {
if (max_v < itr->second) {
max_v = itr->second;
cnd.push_back(make_pair(itr->first, itr->second));
}
}
REP(i,(1 << 15)) {
ll sum_w = 0;
ll sum_v = 0;
REP(j,15) {
if ((i >> j) & 1) {
sum_w += w[j + 15];
sum_v += v[j + 15];
}
}
if (sum_w <= W) {
ans = max(ans, sum_v);
}
int l = 0, r = (int)cnd.size();
while (r - l > 1) {
int mid = (l + r) / 2;
if (cnd[mid].first + sum_w <= W) l = mid;
else r = mid;
}
if (sum_w + cnd[l].first <= W) {
sum_v += cnd[l].second;
ans = max(ans, sum_v);
}
}
cout << ans << endl;
return 0;
}
bool w_1000 = true;
REP(i,N) {
if (1000 < w[i]) {
w_1000 = false;
}
}
if (w_1000) {
for (int i = 0; i < N; i++) {
for (ll j = 250005; j >= 0; j--) {
if (dp[j] > 0) {
dp[j + w[i]] = max(dp[j + w[i]], dp[j] + v[i]);
}
}
dp[w[i]] = max(dp[w[i]], v[i]);
}
ll ans = 0;
for (ll i = 0; i <= min(W, 300000LL); i++) {
ans = max(ans, dp[i]);
}
cout << ans << endl;
return 0;
}
fill (dp, dp + 300010, 1e18);
dp[0] = 0;
for (int i = 0; i < N; i++) {
for (ll j = 250000; j >= 0; j--) {
dp[j + v[i]] = min(dp[j + v[i]], dp[j] + w[i]);
}
dp[v[i]] = max(dp[v[i]], w[i]);
}
ll ans = 0;
for (ll i = 0; i <= 300000; i++) {
if (dp[i] <= W) {
ans = max(ans, i);
}
}
cout << ans << endl;
return 0;
}
Submission Info
Submission Time |
|
Task |
D - ナップサック問題 |
User |
kosakkun |
Language |
C++14 (GCC 5.4.1) |
Score |
100 |
Code Size |
3571 Byte |
Status |
AC |
Exec Time |
69 ms |
Memory |
2560 KB |
Judge Result
Set Name |
Sample |
Subtask1 |
Subtask2 |
Subtask3 |
Score / Max Score |
0 / 0 |
34 / 34 |
33 / 33 |
33 / 33 |
Status |
|
|
|
|
Set Name |
Test Cases |
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 |
Case Name |
Status |
Exec Time |
Memory |
subtask00_sample_1.txt |
AC |
5 ms |
256 KB |
subtask00_sample_2.txt |
AC |
17 ms |
2304 KB |
subtask00_sample_3.txt |
AC |
10 ms |
256 KB |
subtask00_sample_4.txt |
AC |
10 ms |
256 KB |
subtask01_0.txt |
AC |
17 ms |
2304 KB |
subtask01_1.txt |
AC |
17 ms |
2304 KB |
subtask01_10.txt |
AC |
16 ms |
2304 KB |
subtask01_11.txt |
AC |
17 ms |
2304 KB |
subtask01_12.txt |
AC |
16 ms |
2304 KB |
subtask01_13.txt |
AC |
16 ms |
2304 KB |
subtask01_14.txt |
AC |
16 ms |
2304 KB |
subtask01_2.txt |
AC |
16 ms |
2304 KB |
subtask01_3.txt |
AC |
16 ms |
2304 KB |
subtask01_4.txt |
AC |
5 ms |
256 KB |
subtask01_5.txt |
AC |
5 ms |
256 KB |
subtask01_6.txt |
AC |
5 ms |
256 KB |
subtask01_7.txt |
AC |
16 ms |
2304 KB |
subtask01_8.txt |
AC |
16 ms |
2304 KB |
subtask01_9.txt |
AC |
17 ms |
2304 KB |
subtask02_0.txt |
AC |
43 ms |
1024 KB |
subtask02_1.txt |
AC |
42 ms |
1024 KB |
subtask02_10.txt |
AC |
42 ms |
1024 KB |
subtask02_11.txt |
AC |
43 ms |
1024 KB |
subtask02_12.txt |
AC |
42 ms |
1024 KB |
subtask02_13.txt |
AC |
34 ms |
256 KB |
subtask02_14.txt |
AC |
42 ms |
1024 KB |
subtask02_2.txt |
AC |
43 ms |
1024 KB |
subtask02_3.txt |
AC |
42 ms |
1024 KB |
subtask02_4.txt |
AC |
42 ms |
1024 KB |
subtask02_5.txt |
AC |
42 ms |
1024 KB |
subtask02_6.txt |
AC |
42 ms |
1024 KB |
subtask02_7.txt |
AC |
42 ms |
1152 KB |
subtask02_8.txt |
AC |
42 ms |
1024 KB |
subtask02_9.txt |
AC |
42 ms |
1024 KB |
subtask03_0.txt |
AC |
68 ms |
2560 KB |
subtask03_1.txt |
AC |
68 ms |
2560 KB |
subtask03_10.txt |
AC |
68 ms |
2560 KB |
subtask03_11.txt |
AC |
68 ms |
2560 KB |
subtask03_2.txt |
AC |
68 ms |
2560 KB |
subtask03_3.txt |
AC |
68 ms |
2560 KB |
subtask03_4.txt |
AC |
68 ms |
2560 KB |
subtask03_5.txt |
AC |
68 ms |
2560 KB |
subtask03_6.txt |
AC |
68 ms |
2560 KB |
subtask03_7.txt |
AC |
68 ms |
2560 KB |
subtask03_8.txt |
AC |
69 ms |
2560 KB |
subtask03_9.txt |
AC |
68 ms |
2560 KB |