编辑代码

def fruit_knapsack(weights, values, max_weight):
    num_fruits = len(weights)

    # 初始化动态规划数组
    dp = [[0] * (max_weight + 1) for _ in range(num_fruits + 1)]

    # 动态规划过程
    for i in range(1, num_fruits + 1):
        for j in range(1, max_weight + 1):
            if weights[i-1] > j:
                dp[i][j] = dp[i-1][j]
            else:
                dp[i][j] = max(dp[i-1][j], dp[i-1][j-weights[i-1]] + values[i-1])

    # 找到最优策略
    max_value = dp[num_fruits][max_weight]

    # 回溯找到具体策略
    selected_fruits = []
    i, j = num_fruits, max_weight
    while i > 0 and j > 0:
        if dp[i][j] != dp[i-1][j]:
            selected_fruits.append({'name': f'Fruit-{i}', 'weight': weights[i-1], 'value': values[i-1]})
            j -= weights[i-1]
        i -= 1

    return max_value, selected_fruits[::-1]

# 测试数据
weights = [15, 18, 10, 9]
values = [300, 180, 150, 270]
max_weight = 20

# 打印结果
max_value, selected_fruits = fruit_knapsack(weights, values, max_weight)
print(f"最大总价值:{max_value}")
print("装水果的策略:")
for fruit in selected_fruits:
    print(f"{fruit['name']} (Weight: {fruit['weight']} kg, Value: {fruit['value']} yuan)")