Java 所有可能的酒瓶选择方法的回溯解决方案

Java 所有可能的酒瓶选择方法的回溯解决方案,java,dynamic-programming,backtracking,Java,Dynamic Programming,Backtracking,我刚开始练习回溯和DP相关的问题。我正在经历这些。关于酒瓶的选择问题。我首先想写一个代码来打印所有可能的选择酒瓶的方法 问题陈述: 想象一下,你在一个架子上有一堆N种葡萄酒,它们彼此挨着放。为了简单起见,让我们从左到右分别用1到N的整数对摆在架子上的葡萄酒进行编号。对于销售,您可以选择左边的或右边的。打印所有可能的方式,酒瓶可以卖吗 我的代码如下 public static void backtrackWineAll(List<Integer> priceList, List<

我刚开始练习回溯和DP相关的问题。我正在经历这些。关于酒瓶的选择问题。我首先想写一个代码来打印所有可能的选择酒瓶的方法

问题陈述:
想象一下,你在一个架子上有一堆N种葡萄酒,它们彼此挨着放。为了简单起见,让我们从左到右分别用1到N的整数对摆在架子上的葡萄酒进行编号。对于销售,您可以选择左边的或右边的。打印所有可能的方式,酒瓶可以卖吗

我的代码如下

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);


            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);

        }                       
    }
public static void backtrackWineAll(列出价格表,列出选项){
if(priceList.isEmpty()){
System.out.println(choosen);
}
否则{
整数优先=价格表。删除(0);
choosen.add(first);//选择第一瓶。
backtrackWineAll(价格表,choosen);
choosen.remove(choosen.size()-1);
价格表。添加(0,第一);
int lastPos=priceList.size()-1;
整数last=priceList.remove(lastPos);
choosen.add(last);//选择最后一瓶。
backtrackWineAll(价格表,choosen);
choosen.remove(choosen.size()-1);
价格表。添加(最后一个);
}                       
}
它不起作用。它正在打印两次结果。有人能指出哪里出了问题吗

关于如何处理DP问题,有什么建议吗


谢谢。

如果
价目表
的大小为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);
        }
    }
}

非常感谢。我真蠢;)了解动态问题的任何参考资料?@Jeevi不客气。我没有建议的参考文献。是的,请阅读标记为“动态编程”的堆栈溢出问题:)
[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]