我们可以使用
动态规划方法来解决这个问题。
让我们将其分解为子问题,其中每个子问题的解(p,s)是购买产品0到p从供应商0到s的成本,以及要购买的供应商列表。以下是算法:
memo = {}
for s in range(0, len(suppliers)):
for p in range(0, len(products)):
if p == 0 and s == 0:
memo[p, s] = cost(suppliers[s], products[p]), [s]
elif p == 0:
old_cost, old_list = memo[p, s-1]
new_cost = cost(suppliers[s], products[p]) + shipping(suppliers[s])
if new_cost < old_cost:
memo[p, s] = new_cost, [s]
else:
memo[p, s] = old_cost, old_list
elif s == 0:
cost, old_list = memo[p-1, s]
cost += cost(suppliers[s], products[p])
memo[p, s] = cost, old_list + [s]
else:
new_cost, new_sublist = memo[p-1, s-1]
new_cost += cost(suppliers[s], products[p])
if s not in new_sublist:
new_cost += shipping(suppliers[s])
new_sublist += [s]
old_cost, old_sublist = memo[p, s-1]
if new_cost < old_cost:
result = new_cost, new_sublist
else:
result = old_cost, old_sublist
memo[p, s] = result
最终结果是
memo[P, S]
(其中S是供应商的数量,P是产品类型的数量)。该算法的运行时间为O(S*P)。