Submission #265591

#TimeUsernameProblemLanguageResultExecution timeMemory
265591cjoaDetecting Molecules (IOI16_molecules)C++11
31 / 100
2 ms640 KiB
#include "molecules.h"

#include <iostream>
#include <vector>
#include <map>
#include <cassert>

using namespace std;

int N;
vector<int> W;
bool cached[104][1004];
bool memo[104][1004];
bool P[104][1004];
bool go(int n, int sum) {
   if (sum == 0) return true;
   if (sum < 0) return false;
   if (n >= N)
      return false;

   if (cached[n][sum])
      return memo[n][sum];

   bool res = false;

   // take
   if (go(n+1, sum-W[n])) {
      res = true;
      P[n][sum] = true;
   }
   // ignore
   else if (go(n+1, sum)) {
      res = true;
      P[n][sum] = false;
   }
   cached[n][sum] = true;
   memo[n][sum] = res;

   return res;
}

std::vector<int> find_subset(int l, int u, std::vector<int> w) {
   N = w.size();
   assert(N <= 100 && u <= 1000);
   W = w;
   for (int sum = l; sum <= u; ++sum) {
      bool can = go(0, sum);
      if (can) {
         vector<int> res;
         for (int n = 0, s = sum; s != 0; ) {
            if (P[n][s]) {
               res.push_back(n);
               s -= W[n];
               n++;
            }
            else {
               n++;
            }
         }
         return res;
      }
   }

   return {};
}
#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...