【发布时间】:2015-07-24 11:04:41
【问题描述】:
给了我一张桌子
商店
[A][B][C]
产品
[P1][P2][P3][P4]
它们的价格如下所示
[ ][A][B][C]
[P1][6][4][2]
[P2][3][5][7]
[P3][1][9][9]
[P4][8][4][9]
假设用户想尽可能便宜地购买 2 家商店的所有东西,是否只有有效的算法?
这是旅行购买者问题吗?
【问题讨论】:
给了我一张桌子
商店
[A][B][C]
产品
[P1][P2][P3][P4]
它们的价格如下所示
[ ][A][B][C]
[P1][6][4][2]
[P2][3][5][7]
[P3][1][9][9]
[P4][8][4][9]
假设用户想尽可能便宜地购买 2 家商店的所有东西,是否只有有效的算法?
这是旅行购买者问题吗?
【问题讨论】:
假设:
用户想购买 2 家商店的所有东西
算法草图:
使用以存储为列和行的二维查找表。
[x][A] [B] [C]
[A][inf][] []
[B][] [inf][]
[C][] [] [inf]
对角线初始化为无穷大,因为您需要选择两个不同的商店。
现在填充查找表的右上三角或左下三角。
例如在位置[A],[B]你选择了A店和B店。因此只能从这两家店购买产品,这意味着你可以做一个贪婪的方法(取便宜的那个)。最后将价格总和存储在查找表中。
具有最低值的条目是您的问题的解决方案。
此外,您需要检查一家商店的所有产品都比另一家便宜的情况,因此在此草图中,所有产品都将在一家商店购买。
算法的复杂度应该是 O(n²m),其中 n 是商店的数量,m 是产品的数量。
【讨论】:
我感觉只能使用排除。在每一步,您都会删除一个效率最低的商店。这使得多项式邮件的解决方案在最坏的 O(N³) 时间复杂度下。
【讨论】:
您可以再添加三列。
1 代表 min(A,B)
1 代表 min(A,C)
1 为 min(B,C)
计算这三列的总和。如果最小和是列 min(A,C),则转到存储 A 和 C。
这种算法在复杂性方面会非常有效。
【讨论】: