Решение задачи о рюкзаке: методы и примеры кода

Приношу извинения, но я не могу получить доступ к внешним URL-адресам или просматривать Интернет. Однако я могу дать вам краткое объяснение проблемы с рюкзаком и предложить различные методы ее решения вместе с примерами кода.

Задача о рюкзаке — широко известная задача оптимизации в информатике. Он включает в себя выбор подмножества предметов из заданного набора, каждый со своим весом и ценностью, чтобы максимизировать общую ценность, сохраняя при этом общий вес в пределах заданного предела (емкости рюкзака). Задача называется «рюкзак», потому что ее можно представить как упаковку предметов с учетом их веса и ценности.

Вот несколько распространенных способов решения проблемы с рюкзаком:

  1. Грубая сила (рекурсивный):

    • Этот метод предполагает перебор всех возможных комбинаций элементов, чтобы найти тот, у которого максимальное значение в пределах допустимого веса.
    • Он имеет экспоненциальную временную сложность и неэффективен для крупных проблем.

    Пример кода (на Python):

    def knapsack_recursive(values, weights, capacity, n):
       # Base case: no items or no capacity
       if n == 0 or capacity == 0:
           return 0
    
       # If the weight of the nth item exceeds the capacity, skip it
       if weights[n-1] > capacity:
           return knapsack_recursive(values, weights, capacity, n-1)
    
       # Return the maximum value by either including or excluding the nth item
       return max(
           values[n-1] + knapsack_recursive(values, weights, capacity - weights[n-1], n-1),
           knapsack_recursive(values, weights, capacity, n-1)
       )
    
    # Usage example
    values = [60, 100, 120]
    weights = [10, 20, 30]
    capacity = 50
    n = len(values)
    max_value = knapsack_recursive(values, weights, capacity, n)
    print("Maximum value:", max_value)
  2. Динамическое программирование:

    • Этот метод использует подход динамического программирования для решения проблемы путем ее разбиения на перекрывающиеся подзадачи и сохранения их решений.
    • Временная сложность составляет O(n * вместимость), где n — количество предметов, а вместимость — вместимость рюкзака.

    Пример кода (на Python):

    def knapsack_dynamic_programming(values, weights, capacity):
       n = len(values)
       dp = [[0] * (capacity + 1) for _ in range(n + 1)]
    
       for i in range(n + 1):
           for j in range(capacity + 1):
               if i == 0 or j == 0:
                   dp[i][j] = 0
               elif weights[i-1] <= j:
                   dp[i][j] = max(
                       values[i-1] + dp[i-1][j - weights[i-1]],
                       dp[i-1][j]
                   )
               else:
                   dp[i][j] = dp[i-1][j]
    
       return dp[n][capacity]
    
    # Usage example
    values = [60, 100, 120]
    weights = [10, 20, 30]
    capacity = 50
    max_value = knapsack_dynamic_programming(values, weights, capacity)
    print("Maximum value:", max_value)
  3. Жадный алгоритм:

    • При таком подходе элементы выбираются на основе жадной стратегии с учетом соотношения их ценности и веса.
    • Это не всегда может обеспечить оптимальное решение, но может быть эффективным с точки зрения вычислений.

    Пример кода (на Python):

    def knapsack_greedy(values, weights, capacity):
       n = len(values)
       ratio = [values[i] / weights[i] for i in range(n)]
       items = sorted(range(n), key=lambda k: -ratio[k])
    
       max_value = 0
       knapsack_weight = 0
       for item in items:
           if knapsack_weight + weights[item] <= capacity:
               max_value += values[item]
               knapsack_weight += weights[item]
           else:
               remaining_capacity = capacity - knapsack_weight
               max_value += ratio[item] * remaining_capacity
               break
    
       return max_value
    
    # Usage example
    values = [60, 100, 120]
    weights = [10, 20, 30]
    capacity = 50
    max_value = knapsack_greedy(values, weights, capacity)
    print("Maximum value:", max_value)