제출 #568201

#제출 시각아이디문제언어결과실행 시간메모리
568201d4xnDetecting Molecules (IOI16_molecules)C++17
10 / 100
5 ms1212 KiB
#pragma GCC optimize ("Ofast")

#include "molecules.h"

#include <bits/stdc++.h>
using namespace std; 

#define vi vector<int>
#define ll long long
#define mp make_pair
#define pb push_back

map<pair<int, int>, int> dp;
vi sb;

int findSubset(int x, int r, vi &w) {
    if (r == 0) return 0;

    if (x == 0) {
        if (w[x] <= r) {
            return w[x];
        }
        return 0;
    }
    
    auto it = dp.find(mp(x, r));
    if (it != dp.end()) return it->second;

    if (w[x] > r) {
        return dp[mp(x, r)] = findSubset(x-1, r, w);
    }

    return dp[mp(x, r)] = max(
        findSubset(x-1, r, w),
        findSubset(x-1, r-w[x], w) + w[x]
    );
}

void constructAns(int x, int r, vi &w) {
    if (r == 0) return;

    if (x == 0) {
        if (w[x] <= r) {
            sb.pb(x);
        }
        return;
    }
    
    if (w[x] > r) {
        constructAns(x-1, r, w);
        return;
    }

    int c1 = dp[mp(x-1, r)];
    int c2 = dp[mp(x-1, r-w[x])] + w[x];

    if (c1 > c2) {
        constructAns(x-1, r, w);
    }
    else {
        sb.pb(x);
        constructAns(x-1, r-w[x], w);
    }
}

std::vector<int> find_subset(int l, int u, std::vector<int> w) {
    int n = w.size();
    findSubset(n-1, u, w);

    if (dp[mp(n-1, u)] >= l) {
        constructAns(n-1, u, w);
        return sb;
    }

    return vector<int>(0);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...