Files
School/Anul 1/Semestrul 1/Fundamentals of Programming/a4-912-Cujba-Daniel/dynamic_programming.py
T
2024-08-31 12:07:21 +03:00

35 lines
1.1 KiB
Python

# 3.Given the set of positive integers S, partition this set into two subsets S1 and S2 so that the difference between
# the sum of the elements in S1 and S2 is minimal. For example, for set S = { 1, 2, 3, 4, 5 },
# the two subsets could be S1 = { 1, 2, 4 } and S2 = { 3, 5 }. Display at least one of the solutions.
def naive(s,s1,s2):
if len(s)==0:
return [s1,s2]
x=s.pop()
x1=naive(s.copy(),s1+[x],s2)
x2=naive(s.copy(),s1,s2+[x])
if abs(sum(x1[0])-sum(x1[1]))<abs(sum(x2[0])-sum(x2[1])):
return x1
else:
return x2
def naive_imp(s):
return naive(s.copy(),[],[])
def dynamic(s):
half_sum=sum(s)//2+1
data=[[False,[]] for _ in range(half_sum)]
data[0]=[True,[]]
for i in s:
for j in range(half_sum):
if data[j][0] and j+i<half_sum and (i not in data[j][1]):
data[j+i]=[True,data[j][1]+[i]]
for i in range(half_sum-1,0,-1):
if data[i][0]:
return [data[i][1],[j for j in s if j not in data[i][1]]]
if __name__ == "__main__":
s=[1,2,3,4,5]
print("Naive: {}".format(naive_imp(s)))
print("Dynamic: {}".format(dynamic(s)))