class BacktrackingSubsetSum:
def __init__(self, nums, target):
self.nums = nums
self.target = target
self.result = []
def backtrack(self, start, path, current_sum):
if current_sum == self.target:
self.result = path.copy()
return True
if current_sum > self.target:
return False
for i in range(start, len(self.nums)):
path.append(self.nums[i])
if self.backtrack(i + 1, path, current_sum + self.nums[i]):
return True
path.pop()
return False
class GreedySubsetSum:
def __init__(self, nums, target):
self.nums = sorted(nums, reverse=True)
self.target = target
self.result = []
def greedy(self):
total = 0
for num in self.nums:
if total + num <= self.target:
self.result.append(num)
total += num
if total == self.target:
break
return total == self.target
# Driver code
nums = [3, 1, 7, 9]
target = 10
# Greedy approach
greedy_solver = GreedySubsetSum(nums, target)
greedy_found = greedy_solver.greedy()
print("Greedy subset:", " -> ".join(map(str, greedy_solver.result)) + " -> null" if greedy_found else "No subset found")
# Backtracking approach
backtrack_solver = BacktrackingSubsetSum(nums, target)
backtrack_found = backtrack_solver.backtrack(0, [], 0)
if backtrack_found:
print("Backtracking subset:", " -> ".join(map(str, backtrack_solver.result)) + " -> null")
else:
print("No subset found")if current_sum == self.target:
check if current subset sums exactly to target
if current_sum > self.target:
stop exploring path if sum exceeded target
for i in range(start, len(self.nums)):
try each number starting from current index
path.append(self.nums[i])
include current number in subset
if self.backtrack(i + 1, path, current_sum + self.nums[i]):
recurse to next number with updated sum
remove last number to backtrack and try other options
if total + num <= self.target:
greedy picks number only if it doesn't exceed target
stop if target sum reached
Greedy subset: 9 -> 1 -> null
Backtracking subset: 3 -> 7 -> null