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