Submission #694284


Source Code Expand

#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
AC × 4
AC × 19
AC × 17
AC × 14
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