Если priceList
достигает размера 1, выбор первой бутылки аналогичен выбору последней бутылки.Поэтому в этом случае следует выбирать только первую или последнюю бутылку.
Один из способов сделать это - выбрать последнюю бутылку, только если размер priceList
больше 1:
public static void backtrackWineAll(List<Integer> priceList, List<Integer> choosen) {
if(priceList.isEmpty()) {
System.out.println(choosen);
} else {
Integer first = priceList.remove(0);
choosen.add(first);//choose the first bottle.
backtrackWineAll(priceList, choosen);
choosen.remove(choosen.size()-1);
priceList.add(0, first);
if (priceList.size () > 1) { // the added condition
int lastPos = priceList.size()-1;
Integer last = priceList.remove(lastPos);
choosen.add(last); //choose the last bottle.
backtrackWineAll(priceList, choosen);
choosen.remove(choosen.size()-1);
priceList.add(last);
}
}
}
Другими словами, когда вы выбираете n-1 бутылок, есть только один способ выбрать следующую (последнюю оставшуюся) бутылку.
Для входного списка [10, 20, 30,40, 50] выводит вывод:
[10, 20, 30, 40, 50]
[10, 20, 30, 50, 40]
[10, 20, 50, 30, 40]
[10, 20, 50, 40, 30]
[10, 50, 20, 30, 40]
[10, 50, 20, 40, 30]
[10, 50, 40, 20, 30]
[10, 50, 40, 30, 20]
[50, 10, 20, 30, 40]
[50, 10, 20, 40, 30]
[50, 10, 40, 20, 30]
[50, 10, 40, 30, 20]
[50, 40, 10, 20, 30]
[50, 40, 10, 30, 20]
[50, 40, 30, 10, 20]
[50, 40, 30, 20, 10]