Злой ученый разработал инъекцию, которая вызывает у рыбы ненасытный голод. Сделав эту инъекцию, рыба размера x может съесть другую рыбу меньшего размера y (y ‹ x) и стать рыбой размера x + y, сохранив этот голод. В аквариуме есть несколько рыб разного размера. Ученый помещает инъецированную рыбу в этот аквариум с целью, чтобы в конечном итоге осталась только 1 рыба. Для этого ученому разрешено только два типа ходов: либо добавить нормальную рыбу любого размера, либо удалить из аквариума уже существующую нормальную рыбу. Зная размеры других рыб в аквариуме и размер инъецированных рыб, напишите программу для определения минимального количества ходов, необходимых ученому для достижения своей цели. Например, предположим, что в аквариуме 5 рыб, введенная рыба имеет размер 10, а остальные рыбы имеют размеры 9, 20, 25 и 100. Чтобы гарантировать, что в аквариуме останется только 1 рыба, ученый должен удалить рыбу размера 100 и добавить рыбу размера 3. Таким образом, результат равен 2. Последовательность шагов показана ниже. В фигурных скобках показаны размеры рыбок в аквариуме на каждом шаге. Выделенное число — это размер инъекционной рыбы.
Формат ввода: {infectedFish} # {a,b,c,d ... }, где a,b,c и т. д. — обычные рыбы.
Пример:
- 10#9,20,25,100 ===> 2
- 3#25,20,100,400,500 ===> 5
- 50#25,20,9,100 ===>0
Я использовал следующий код для решения проблемы.
public static int count(int inf, int a[], int i, int op){
//base case
if(i==a.length){
return op;
}
while(i<a.length && inf>a[i]){
inf+=a[i];
i++;
}
if(i==a.length){
return op;
}
int curr = inf+inf-1;
return Math.min(count(curr, a, i, op+1), count(inf, a, i+1, op+1));
}
При вызове с помощью System.out.println(count(x, a, 0, 0));
x заражается рыба и задается отсортированный массив;
Правилен ли этот подход? Если это так, похоже, что у него есть подзадача команды, как мы можем сделать мемоизацию?
infectedFish
. - person Dialecticus   schedule 06.12.2019