-
ブルートフォース法: ブルートフォース法は、全ての可能な部分集合を試し、合計を計算して目的の合計と一致するかどうかを確認する方法です。以下はPythonでのブルートフォース法のコード例です。
def subset_sum_bruteforce(numbers, target): subsets = [] for i in range(2len(numbers)): subset = [numbers[j] for j in range(len(numbers)) if (i & (1 << j))] if sum(subset) == target: subsets.append(subset) return subsets numbers = [1, 2, 3, 4, 5] target = 7 result = subset_sum_bruteforce(numbers, target) print(result)
-
動的計画法: 動的計画法は、再帰的な関数呼び出しとメモ化を使用して、部分問題の結果を保存し、効率的に解を見つける方法です。以下はPythonでの動的計画法のコード例です。
def subset_sum_dp(numbers, target): memo = {} def subset_sum_recursive(index, current_sum): if index == len(numbers): return current_sum == target if (index, current_sum) in memo: return memo[(index, current_sum)] include = subset_sum_recursive(index + 1, current_sum + numbers[index]) exclude = subset_sum_recursive(index + 1, current_sum) memo[(index, current_sum)] = include or exclude return include or exclude result = subset_sum_recursive(0, 0) subsets = [] if result: for i in range(len(numbers)): if subset_sum_recursive(i + 1, result - numbers[i]): subsets.append(numbers[i]) return subsets numbers = [1, 2, 3, 4, 5] target = 7 result = subset_sum_dp(numbers, target) print(result)
-
バックトラッキング: バックトラッキングは、再帰的な探索と枝刈りを使用して、可能性のある解候補を探索します。以下はPythonでのバックトラッキングのコード例です。
def subset_sum_backtracking(numbers, target): subsets = [] def backtrack(index, current_sum, current_subset): if current_sum == target: subsets.append(current_subset[:]) return if current_sum > target or index == len(numbers): return current_subset.append(numbers[index]) backtrack(index + 1, current_sum + numbers[index], current_subset) current_subset.pop() backtrack(index + 1, current_sum, current_subset) backtrack(0, 0, []) return subsets numbers = [1, 2, 3, 4, 5] target = 7 result = subset_sum_backtracking(numbers, target) print(result)
これらは、サブセットの合計を見つけるための一部の一般的な方法です。他にもさまざまなアプローチがありますが、上記の方法はよく知られていて効果的です。それぞれのアプローチには利点と制限がありますので、具体的な要件に合わせて適切な方法を選択してください。