# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
117109 | Lawliet | Detecting Molecules (IOI16_molecules) | C++17 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#include "molecules.h"
#define MAX 10010
using namespace std;
int N, L, U;
int indAnt[MAX];
int valueAnt[MAX];
bool dp[MAX];
vector<int> ans;
void add(int w, int i)
{
for(int g = U ; g >= w ; g--)
{
if(dp[g - w] && !dp[g])
{
dp[g] = true;
indAnt[g] = i;
valueAnt[g] = w;
}
}
}
int[] find_subset(int l, int u, int[] w)
{
L = l; U = u;
dp[0] = true;
ans.clear();
memset(dp , false , sizeof(dp));
memset(indAnt , -1 , sizeof(indAnt));
memset(valueAnt , -1 , sizeof(valueAnt));
int ind = 0;
while( w[ind] != 0 )
{
add( w[ind] , ind);
ind++;
}
int can = -1;
for(int g = L ; g <= U ; g++)
if(dp[g]) can = g;
if(can == -1)
{
int resp[0];
//return resp;
//printf("N\n");
return resp;
}
while( indAnt[can] != -1 )
{
ans.push_back( indAnt[can] );
can -= valueAnt[can];
}
int resp[ans.size()];
for(int g = 0 ; g < ans.size() ; g++)
resp[g] = ans[g];
return resp;
}
/*int main()
{
scanf("%d %d %d",&N,&L,&U);
int W[N];
for(int g = 0 ; g < N ; g++)
scanf("%d",&W[g]);
find_subset(L , U , W);
}*/