Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 组合谜题_Algorithm_Combinations - Fatal编程技术网

Algorithm 组合谜题

Algorithm 组合谜题,algorithm,combinations,Algorithm,Combinations,我想知道解决以下问题的最佳方法是什么: 我现在有一张地图。比如说,这是一张用餐地图,上面有你在用餐时可以提供的饮料。例如 早餐-橙汁 早餐-咖啡 午餐-橙汁 午餐-苏打水 午餐啤酒 晚餐-苏打水 晚餐-啤酒 晚餐-葡萄酒 所以我的收藏真的是Map 我需要做的是创建一个列表,列出用餐期间的各种饮料组合。在这种情况下,我将有18个组合。例如 [ [ 早餐->橙汁, 午餐->橙汁, 晚餐->苏打水 ] [ 早餐->橙汁, 午餐->橙汁, 晚餐->啤酒 ] [ 早餐->橙汁, 午餐->橙汁, 晚餐->葡

我想知道解决以下问题的最佳方法是什么:

我现在有一张
地图
。比如说,这是一张用餐地图,上面有你在用餐时可以提供的饮料。例如

早餐-橙汁 早餐-咖啡

午餐-橙汁 午餐-苏打水 午餐啤酒

晚餐-苏打水 晚餐-啤酒 晚餐-葡萄酒

所以我的收藏真的是
Map

我需要做的是创建一个
列表
,列出用餐期间的各种饮料组合。在这种情况下,我将有18个组合。例如

[

[ 早餐->橙汁, 午餐->橙汁, 晚餐->苏打水 ]

[ 早餐->橙汁, 午餐->橙汁, 晚餐->啤酒 ]

[ 早餐->橙汁, 午餐->橙汁, 晚餐->葡萄酒 ]

[ 早餐->橙汁, 午餐->苏打水, 晚餐->苏打水, ]

等等。。。 ]

我感兴趣的是看看其他人将如何着手创建最终的收藏

另外,我正在使用java,所以漂亮的功能性东西是不允许的

谢谢

编辑
膳食类型是动态的。也就是说,晚餐可以从列表中删除,也可以添加早午餐。

如果我做对了,这里没有什么神奇之处,只需在嵌套循环中迭代3个集合即可

for (String breakfastBev : breakfast) {
  for (String lunchBev : lunch) {
    for (String dinnerBev : dinner) {
      System.out.println(breakfastBev + ", " + lunchBev + ", " + dinnerBev);
    }
  }
}
我相信现在您可以了解如何使用
地图
和输出
列表
:-)

编辑:对于更改的需求,一种方法是递归:

main() {
    List<Map<String, String>> output = new ArrayList<Map<String, String>>();
    recordBeverages(new HashMap(), beveragesByMeal, output);
}

void recordBeverages(Map visited, Map meals, List<Map> output) {
    if(meals.isEmpty()) {
        output.add(visited);
    }
    String mealType = meals.keySet().iterator().next();
    Map remainingMeals = new HashMap(visited);
    remainingMeals.keySet().remove(mealType);
    for(Beverage bev : meals.get(mealType)) {
        Map newVisited = new HashMap(visited);
        newVisited.put(mealType, bev);    

        recordBeverages(newVisited, remainingMeals, output);
    }
}
main(){
列表输出=新的ArrayList();
recordBeverages(新的HashMap(),BeveragesbyFine,输出);
}
作废记录饮料(访问地图、用餐地图、列表输出){
if(fines.isEmpty()){
输出。添加(已访问);
}
String mealType=fines.keySet().iterator().next();
Map remainingfends=新HashMap(已访问);
remainingfines.keySet().remove(mealType);
用于(饮料bev:膳食。获取(mealType)){
Map newVisited=新HashMap(已访问);
newvisted.put(mealType,bev);
记录饮料(新到访、剩余膳食、产量);
}
}

没有经过测试,但你明白了。使用一组计数器,计数器的数量与用餐的数量相同。在一个循环中,增加第一个,直到它到达第一顿饭的最后一个饮料,然后增加下一个(滴流)。当最后一顿饭的最后一杯饮料到达时,你就完成了


我将把代码留给您。

啊,我应该补充一点,我不知道有多少种膳食类型。例如,可以增加早午餐。尽管如此,我认为你可能是对的,因为我考虑过了。这就是我如何实现它的,所以我很高兴能确信这是一种可以接受的方式。谢谢