Каждый раз, когда происходит выстрел, возможны два исхода, охотник попал или промахнулся. Вероятность первого - p, второго - 1-p. И соответсвенно общая вероятность этого события становится равна prevP * p. Имеет смысл упорядочить массив вероятностей попадания, чтобы сократить количество возможных ветвлений. Так как когда ветвление достигнет нужного количества убийств, его можно прекращать.
Браконьер стреляет в животное, вероятность убить которое максимальное из оставшихся. В случае попадания, нужное количество жертв уменьшается на один. Иначе остается прежним. Вероятности перемножаются prevP * p. Общая верояность будет равна их сумме. Если в каком то из ветвлений оставшиеся количество животных меньше необходимого количества, то можно его прекращать, и считать сумарную вероятность убить на этом ветвлении равной 0.
function solve(arr, k) {
arr.sort((a, b) => a[1] - b[1]);
return findProbability(arr, k); // изначально вероятность равна 1.
}
function findProbability([animal, ...other], count, probability = 1) { // текущее животное и оставшиеся
if (count > other.length + 1) return 0;
if (count === 0) return probability;
if (!animal) return 0;
return findProbability(other, count - 1, probability * animal[1]) +
findProbability(other, count, probability * (1 - animal[1]));
}
console.log(solve([ ["медведь", 0.5], ["тигр", 0.5], ["лев", 0.5] ], 2))