【问题标题】:Backtracking solution of all possible ways of choosing wine bottle选择酒瓶的所有可能方式的回溯解决方案
【发布时间】:2018-11-12 22:27:56
【问题描述】:

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

问题陈述:
想象一下,你有一组 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);

        }                       
    }

它不工作。它正在打印两次结果。有人可以指出出了什么问题吗?

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

谢谢。

【问题讨论】:

  • 是的,阅读标记为“动态编程”的 Stack Overflow 问题 :)

标签: java dynamic-programming backtracking


【解决方案1】:

如果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]

【讨论】:

  • 非常感谢。我太愚蠢了 ;) 有任何了解动态问题的参考资料吗?
  • @Jeevi 不客气。我没有参考建议。
猜你喜欢
  • 1970-01-01
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
相关资源
最近更新 更多