我在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]
在这种情况下,一切都是平等的,所以我会选择Drink 1的值[1,2]
globalList = [1,2]
noOfDrinksRequired = 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步
我知道这不是非常优化的解决方案(空间复杂度m * n和时间复杂度不确定)。谁能告诉我这个问题的优化解决方案。此外,我不确定我的解决方案是否能100%正常工作。
答案 0 :(得分:2)
这是一个经典的套装问题 - https://en.m.wikipedia.org/wiki/Set_cover_problem
事实上,这是卡普的21个NP完全问题之一。对此有一些近似和贪婪的解决方案。