IOI '16 P1 - Detecting Molecules
View as PDFPetr is working for a company that has built a machine for detecting molecules. Each molecule has a positive integer weight. The machine has a detection range , where 
 and 
 are positive integers. The machine can detect a set of molecules if and only if this set contains a subset of the molecules with total weight belonging to the machine's detection range.
Formally, consider  molecules with weights 
. The detection is successful if there is a set of distinct indices 
 such that 
.
Due to specifics of the machine, the gap between  and 
 is guaranteed to be greater than or equal to the weight gap between the heaviest and the lightest molecule. Formally, 
, where 
 and 
.
Your task is to write a program which either finds any one subset of molecules with total weight within the detection range, or determines that there is no such subset.
Implementation details
You should implement one function (method):
int find_subset(int l, int u, int w[], int n, int result[])
landu: the endpoints of the detection range,w: weights of the molecules,n: the number of elements in(i.e., the number of molecules),
result: an array of integers. The method should write the indices of molecules that form any one such subset to the firstcells of array
result. If there are several correct answers, write any of them.- The function should return the value of 
. If the required subset does not exist, the function should not write anything to the
resultarray and it should return0. 
Your program may write the indices into the result array in any order.
Sample 1
find_subset(15, 17, {6, 8, 8, 7}, 4, result)
In this example we have four molecules with weights , 
, 
 and 
. The machine can detect subsets of molecules with total weight between 
 and 
, inclusive. Note, that 
. The total weight of molecules 
 and 
 is 
, so the 
result array can contain {1, 3} and the function should return 2. Other possible correct answers are {1, 2}  and 
[2, 3] .
Sample 2
find_subset(14, 15, {5, 5, 6, 6}, 4, result)
In this example we have four molecules with weights , 
, 
 and 
, and we are looking for a subset of them with total weight between 
 and 
, inclusive. Again, note that 
. There is no subset of molecules with total weight between 
 and 
 so the function should return 
0.
Sample 3
find_subset(10, 20, {15, 17, 16, 18}, 4, result)
In this example we have four molecules with weights , 
, 
 and 
, and we are
looking for a subset of them with total weight between 
 and 
, inclusive. Again, note that 
. Any subset consisting of exactly one element has total weight between 
 and 
, so the possible correct answers are: 
{0}, {1}, {2} and {3}.
Subtasks
- (9 points): 
, all
are equal.
 - (10 points): 
and
.
 - (12 points): 
and
.
 - (15 points): 
and
.
 - (23 points): 
and
.
 - (31 points): 
and
.
 
Comments