满足所有Customomer

时间:2017-02-26 07:01:31

标签: algorithm hashmap greedy

我在Online Coding Comp中找到了这个问题。而且我无法有效地解决它。 题 : 在酒吧有N个顾客,他们最喜欢M饮料。顾客满意,如果他至少喝了一杯他自己选择的饮料。我们需要找到最低限度的饮料,以满足所有客户的需求。下面是一个例子

N = 3 # No of Customer 
M = 3 (Maximum Drinks available )
customer 1 : [ 2,1,3]
customer 2 : [1,1]
customer 3 : [2,2,3] 

注意:顾客也可以多次喜欢同样的饮料。 答案:所需饮品的最低数量为2 说明:如果我们准备饮料编号1和2 ,则可以满足所有三个客户。

我的解决方案: 我创建了饮料的hashMap作为关键和客户价值

Drink  : Customer
 1 : [1 ,2]
 2 : [1,3]
 3 : [1,3]
  1. 我会从Hashmap中获取最大的值列表(因为所有客户都是唯一的)。
  2. 在这种情况下,一切都是平等的,所以我会选择Drink 1的值[1,2]

    globalList = [1,2]
    noOfDrinksRequired = 1
    
    1. 现在我将找到Inter Section with All other list,无论哪个交叉点最大,我都会将其添加到Global List (globalList)并将所需饮料的数量增加(noOfDrinksRequired)乘以1。并且还跟踪列表中的元素数量(“客户数量”)。如果列表长度等于客户数量,那么我退出。

      globalList =globalList∩[1,3] #D喝2或3的值
        现在golbalList = [1,2,3]   noOfDrinksRequired + = 1   由于客户3的golbalList.length == N#no   如果不重复第2步

    2. 我知道这不是非常优化的解决方案(空间复杂度m * n和时间复杂度不确定)。谁能告诉我这个问题的优化解决方案。此外,我不确定我的解决方案是否能100%正常工作。

1 个答案:

答案 0 :(得分:2)

这是一个经典的套装问题 - https://en.m.wikipedia.org/wiki/Set_cover_problem

事实上,这是卡普的21个NP完全问题之一。对此有一些近似和贪婪的解决方案。