Submission #694284
Source Code Expand
Copy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i = 0; i < n; i++)
#define all(x) begin(x), end(x)
typedef long long ll;
typedef pair<ll, ll> LP; // int, intでオーバーフロー
const ll INF = 1e18; // LLONG_MAXにしたらオーバーフロー。defineしたらlong longとみなされなくて死。
int n, W;
#define MAX_N 205
ll v[MAX_N], w[MAX_N];
#define MAX_NV 200005
void solve_small_weight_problem()
{
ll dp[2][MAX_NV] = {};
rep(i, 2) rep(j, MAX_NV) dp[i][j] = 0;
rep(i, n) rep(j, MAX_NV) {
int next = (i+1)%2, prev = i%2;
dp[next][j] = max(dp[prev][j], j-w[i]<0 ? 0 : dp[prev][j-w[i]]+v[i]);
}
ll m = 0;
rep(i, W+1)
m = max(m, dp[n%2][i]);
cout << m << endl;
}
#define MAX_NW 200005
void solve_small_value_problem()
{
ll dp[2][MAX_NV];
rep(i, 2) rep(j, MAX_NV) dp[i][j] = INF; dp[0][0] = 0;
rep(i, n) rep(j, MAX_NV) {
int next = (i+1)%2, prev = i%2;
dp[next][j] = min(dp[prev][j], j-v[i]<0 ? INF : dp[prev][j-v[i]]+w[i]);
}
ll m = 0;
rep(i, MAX_NV)
if (dp[n%2][i] <= W)
m = max(m, (ll)i);
cout << m << endl;
}
void get_pruned_all_combination(vector<LP>& bag_pruned, int bag_n, int start_point)
{
// 全列挙
vector<LP> bag; bag.reserve(1 << bag_n);
rep(i, 1 << bag_n) {
ll v_tmp = 0, w_tmp = 0;
for (int j = 0; j < bag_n; j++) {
if (i & (1 << j)) {
v_tmp += v[start_point+j];
w_tmp += w[start_point+j];
}
}
if (w_tmp > W)
continue;
bag.push_back(LP(w_tmp, v_tmp));
}
sort(all(bag));
// いらないものを排除(今思えばやらなくても良かったな)
ll last_v = -1;
rep(i, bag.size()) {
while (i != bag.size() - 1 && bag[i].first == bag[i+1].first) i++;
if (last_v < bag[i].second) {
bag_pruned.push_back(bag[i]);
last_v = bag[i].second; // これを2行下に書いてたせいで昇順になってなかった。昇順になっていなかったことに長い間気づかなかった。プロコンでもassertを使うべきだろうか
}
}
}
void solve_small_n_problem()
{
// bagAとbagBに二分する。
int bagA_n = n / 2, bagB_n = n - bagA_n;
// 両方のbagで、重さでソートかつ重さが大なら価値の大なる組み合わせを全列挙
vector<LP> bagA_pruned; bagA_pruned.reserve(1 << bagA_n);
get_pruned_all_combination(bagA_pruned, bagA_n, 0);
vector<LP> bagB_pruned; bagB_pruned.reserve(1 << bagB_n);
get_pruned_all_combination(bagB_pruned, bagB_n, bagA_n);
// bagAのそれぞれに対応する、最大のbagBの荷物を二分探索で探す
ll m = 0;
rep(i, bagA_pruned.size()) {
LP f = bagA_pruned[i];
if (f.first > W)
break;
vector<LP>::iterator s = upper_bound(all(bagB_pruned), LP(W-f.first, INF)) - 1; // W-f.first以下の最大のbagBを、二分探索で探す。探しものがbagBのmin以上なら、upper_boundは必ず1以上になるので、必ず1が引ける!
m = max(m, f.second + s->second);
}
cout << m << endl;
}
int main(void) {
cin >> n >> W;
bool small_weight_problem = false;
rep(i, n) {
cin >> v[i] >> w[i];
if (v[i] > 1000)
small_weight_problem = true;
}
if (n <= 30)
solve_small_n_problem();
else if (small_weight_problem)
solve_small_weight_problem();
else
solve_small_value_problem();
return 0;
}
Submission Info
Submission Time |
|
Task |
D - ナップサック問題 |
User |
hamko |
Language |
C++11 (GCC 4.9.2) |
Score |
100 |
Code Size |
3746 Byte |
Status |
AC |
Exec Time |
127 ms |
Memory |
4048 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 |
23 ms |
928 KB |
subtask00_sample_2.txt |
AC |
28 ms |
924 KB |
subtask00_sample_3.txt |
AC |
23 ms |
804 KB |
subtask00_sample_4.txt |
AC |
23 ms |
928 KB |
subtask01_0.txt |
AC |
28 ms |
928 KB |
subtask01_1.txt |
AC |
29 ms |
736 KB |
subtask01_10.txt |
AC |
30 ms |
800 KB |
subtask01_11.txt |
AC |
31 ms |
924 KB |
subtask01_12.txt |
AC |
30 ms |
928 KB |
subtask01_13.txt |
AC |
30 ms |
804 KB |
subtask01_14.txt |
AC |
30 ms |
804 KB |
subtask01_2.txt |
AC |
31 ms |
836 KB |
subtask01_3.txt |
AC |
31 ms |
932 KB |
subtask01_4.txt |
AC |
31 ms |
804 KB |
subtask01_5.txt |
AC |
37 ms |
1312 KB |
subtask01_6.txt |
AC |
31 ms |
920 KB |
subtask01_7.txt |
AC |
32 ms |
800 KB |
subtask01_8.txt |
AC |
30 ms |
920 KB |
subtask01_9.txt |
AC |
30 ms |
916 KB |
subtask02_0.txt |
AC |
122 ms |
3872 KB |
subtask02_1.txt |
AC |
124 ms |
3872 KB |
subtask02_10.txt |
AC |
124 ms |
3928 KB |
subtask02_11.txt |
AC |
123 ms |
3876 KB |
subtask02_12.txt |
AC |
123 ms |
3884 KB |
subtask02_13.txt |
AC |
123 ms |
3988 KB |
subtask02_14.txt |
AC |
122 ms |
3872 KB |
subtask02_2.txt |
AC |
123 ms |
3872 KB |
subtask02_3.txt |
AC |
125 ms |
3988 KB |
subtask02_4.txt |
AC |
124 ms |
3872 KB |
subtask02_5.txt |
AC |
122 ms |
3876 KB |
subtask02_6.txt |
AC |
124 ms |
3876 KB |
subtask02_7.txt |
AC |
123 ms |
3992 KB |
subtask02_8.txt |
AC |
123 ms |
3992 KB |
subtask02_9.txt |
AC |
123 ms |
3868 KB |
subtask03_0.txt |
AC |
123 ms |
3992 KB |
subtask03_1.txt |
AC |
123 ms |
3872 KB |
subtask03_10.txt |
AC |
124 ms |
3872 KB |
subtask03_11.txt |
AC |
125 ms |
3996 KB |
subtask03_2.txt |
AC |
124 ms |
3992 KB |
subtask03_3.txt |
AC |
124 ms |
3992 KB |
subtask03_4.txt |
AC |
127 ms |
3820 KB |
subtask03_5.txt |
AC |
124 ms |
3868 KB |
subtask03_6.txt |
AC |
126 ms |
4048 KB |
subtask03_7.txt |
AC |
123 ms |
3992 KB |
subtask03_8.txt |
AC |
122 ms |
3992 KB |
subtask03_9.txt |
AC |
123 ms |
3992 KB |