Приношу извинения, но я не могу получить доступ к внешним URL-адресам или просматривать Интернет. Однако я могу дать вам краткое объяснение проблемы с рюкзаком и предложить различные методы ее решения вместе с примерами кода.
Задача о рюкзаке — широко известная задача оптимизации в информатике. Он включает в себя выбор подмножества предметов из заданного набора, каждый со своим весом и ценностью, чтобы максимизировать общую ценность, сохраняя при этом общий вес в пределах заданного предела (емкости рюкзака). Задача называется «рюкзак», потому что ее можно представить как упаковку предметов с учетом их веса и ценности.
Вот несколько распространенных способов решения проблемы с рюкзаком:
-
Грубая сила (рекурсивный):
- Этот метод предполагает перебор всех возможных комбинаций элементов, чтобы найти тот, у которого максимальное значение в пределах допустимого веса.
- Он имеет экспоненциальную временную сложность и неэффективен для крупных проблем.
Пример кода (на 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)
-
Динамическое программирование:
- Этот метод использует подход динамического программирования для решения проблемы путем ее разбиения на перекрывающиеся подзадачи и сохранения их решений.
- Временная сложность составляет 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)
-
Жадный алгоритм:
- При таком подходе элементы выбираются на основе жадной стратегии с учетом соотношения их ценности и веса.
- Это не всегда может обеспечить оптимальное решение, но может быть эффективным с точки зрения вычислений.
Пример кода (на 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)