from random import randint
def sum_exist(n,p_list, i=0):
if n<min(p_list) or i>=len(p_list):
return False
else:
for p in p_list:
if n%p==0:
return True
else:
return sum_exist(n-p_list[i],p_list,i) or sum_exist(n,p_list,i+1)
def find_s(n, p_list, sum_list, i=0):
if n<min(p_list) or i>=len(p_list):
return []
else:
for p in p_list:
if n%p==0:
for _ in range(n//p):
sum_list.append(p)
return sum_list
else:
result = find_s(n-p_list[i], p_list, sum_list+[p_list[i]])
if len(result)>0:
return result
else:
return find_s(n, p_list, sum_list, i+1)
# ns = [17,7,107,43,146]
# p_lists = [[2,3,5],[3,5],[2,3,37],[3,29],[17,29,37]]
ns = []
p_lists = []
PRIMES = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71]
for i in range(10):
num = randint(1,4)
p_list = [PRIMES[randint(0,len(PRIMES)-1)] for _ in range(num)]
p_list = list(set(p_list))
p_list.sort()
p_lists.append(p_list)
ns.append(randint(2,100))
print("="*200)
print(f'{"n":<5}{"P_list":<20}{"Expected Result":<10}')
for n,p_list in zip(ns,p_lists):
result = sum_exist(n, p_list)
print(f'{str(n):<5}{str(p_list):<20}{str(result):<10}')
print("="*200)
print(f'{"n":<5}{"P_list":<20}{"Expected Result":<120}{"check":<10}{"sum_exist":<10}')
for n,p_list in zip(ns,p_lists):
result = find_s(n, p_list, [])
print(f'{str(n):<5}{str(p_list):<20}{str(result):<120}{str(sum(result)==n):<10}{str(sum_exist(n, p_list)):<10}')