查找符合特定条件的长度为n的进餐的算法

时间:2018-09-29 23:45:40

标签: algorithm

我们正在开发一个烹饪应用程序,该应用程序可以让用户告诉应用程序他们的每周预算,饮食要求以及他们一周要烹饪多少餐。然后,该应用将返回一组符合此条件的餐点。我们目前正在尝试开发此算法。

要深入一点,我们有一些食谱。每个食谱都有一些与之相关的饮食标签(例如素食主义者,素食主义者)。每个食谱还具有与之相关的价格。我们想要创建一种算法,可以发送一些膳食必须具有的饮食标签,以及总预算和膳食数量。该算法应获取这些标签,并找到一组与所需膳食数量相等的进餐,这些进餐的总和少于已发送的总预算,并且其标签与已发送的饮食标签相匹配。

您将如何处理这一问题(甚至适合这种算法,例如Dijkstra的算法)?

谢谢!

编辑:每周都会进行一次提货,我们应该为用户提供各种餐食。因此,该算法将需要返回一个符合条件的随机集。

1 个答案:

答案 0 :(得分:1)

我们可以首先过滤掉所有与给定标签匹配的食物,然后使用递归策略来生成满足给定前提的所有可能集合。然后,我们可以从我们的候选食物集中随机返回一顿饭。共享同一 https://ideone.com/HGgOp7

的工作代码
from random import randint

meals_price = [10, 80, 50, 60, 20, 40, 30]

candidate_meals = []
def solve(index, required_meals, budget_left, selected_meals):
    if index >= len(meals_price):
        return
    if required_meals == 0:
        candidate_meals.append(selected_meals)

    for i in range(index, len(meals_price)):
        if budget_left >= meals_price[i]:
            new_selected_meals = selected_meals.copy()
            new_selected_meals.append(meals_price[i])
            solve(i + 1, required_meals - 1, budget_left - meals_price[i], \
                        new_selected_meals)
    solve(index + 1, required_meals, budget_left, selected_meals)


required_meals = int(input())
total_budget = int(input())
solve(0, required_meals, total_budget, [])

if len(candidate_meals) == 0:
    print ("No meals found!")
else:
    idx = randint(0, len(candidate_meals) - 1)
    meals = candidate_meals[idx]
    print (meals, sum(meals))

其中列表meals_price包含其标签假定与所需标签匹配的餐食价格。该代码在每次运行时针对相同的输入产生不同的输出。让我知道它是否适合您的用例。干杯!