#52839: e04 python嘗試了好久還是過不了(已放棄)


bob981115@gmail.com (Bob)


e04 python嘗試了好久還是過不了:

#   a981. 求和問題
import sys
data = list(map(int, sys.stdin.read().split()))
sys.setrecursionlimit(10000000)
n = data.pop(0)
m = data.pop(0)
data.sort(reverse = False)

middle = len(data) // 2
left = data[:middle]
right = data[middle:]

def subset(arr):
    result = []
    length = len(arr)

    def dfs(idx, total, current_list):
        if idx == length:
            result.append((current_list, total))
            return
        else:
            dfs(idx+1, total+arr[idx], current_list + [arr[idx]])
            dfs(idx+1, total, current_list)

    dfs(0, 0, [])
    return result

left = subset(left)
right = subset(right)

right_map = {}
for arr, sums in right:
    if sums not in right_map:
        right_map[sums] = []
    right_map[sums].append(arr)

result = []
for arr_left, sums in left:
    remain = m - sums
    if remain in right_map:
        for arr_right in right_map[remain]:
            ans = arr_left + arr_right
            result.append(ans)

result.sort()
if result:
    for nums in result:
        print(*nums)
else:
    print(-1)
           
#55128: Re: e04 python嘗試了好久還是過不了(已放棄)


tororo06300@gmail.com (張凱逸)


e04 python嘗試了好久還是過不了:

#   a981. 求和問題
import sys
data = list(map(int, sys.stdin.read().split()))
sys.setrecursionlimit(10000000)
n = data.pop(0)
m = data.pop(0)
data.sort(reverse = False)

middle = len(data) // 2
left = data[:middle]
right = data[middle:]

def subset(arr):
    result = []
    length = len(arr)

    def dfs(idx, total, current_list):
        if idx == length:
            result.append((current_list, total))
            return
        else:
            dfs(idx+1, total+arr[idx], current_list + [arr[idx]])
            dfs(idx+1, total, current_list)

    dfs(0, 0, [])
    return result

left = subset(left)
right = subset(right)

right_map = {}
for arr, sums in right:
    if sums not in right_map:
        right_map[sums] = []
    right_map[sums].append(arr)

result = []
for arr_left, sums in left:
    remain = m - sums
    if remain in right_map:
        for arr_right in right_map[remain]:
            ans = arr_left + arr_right
            result.append(ans)

result.sort()
if result:
    for nums in result:
        print(*nums)
else:
    print(-1)
           



#55129: Re: e04 python嘗試了好久還是過不了(已放棄)


tororo06300@gmail.com (張凱逸)


e04 python嘗試了好久還是過不了:

#   a981. 求和問題
import sys
data = list(map(int, sys.stdin.read().split()))
sys.setrecursionlimit(10000000)
n = data.pop(0)
m = data.pop(0)
data.sort(reverse = False)

middle = len(data) // 2
left = data[:middle]
right = data[middle:]

def subset(arr):
    result = []
    length = len(arr)

    def dfs(idx, total, current_list):
        if idx == length:
            result.append((current_list, total))
            return
        else:
            dfs(idx+1, total+arr[idx], current_list + [arr[idx]])
            dfs(idx+1, total, current_list)

    dfs(0, 0, [])
    return result

left = subset(left)
right = subset(right)

right_map = {}
for arr, sums in right:
    if sums not in right_map:
        right_map[sums] = []
    right_map[sums].append(arr)

result = []
for arr_left, sums in left:
    remain = m - sums
    if remain in right_map:
        for arr_right in right_map[remain]:
            ans = arr_left + arr_right
            result.append(ans)

result.sort()
if result:
    for nums in result:
        print(*nums)
else:
    print(-1)
           
import sys

def solve():
    # 讀取輸入
    try:
        line1 = sys.stdin.readline().split()
        if not line1:
            return
        n, m = map(int, line1)
        
        line2 = sys.stdin.readline().split()
        if not line2:
            return
        nums = sorted(list(map(int, line2)))
    except EOFError:
        return

    found = False
    results = []

    def backtrack(start, current_sum, path):
        nonlocal found
        if current_sum == m:
            print(*(path))
            found = True
            return
        
        if current_sum > m:
            return

        for i in range(start, n):
            # 剪枝:如果當前數字加上去已經超過 m,後面的數字更大,一定也超過
            if current_sum + nums[i] > m:
                break
            
            path.append(nums[i])
            backtrack(i + 1, current_sum + nums[i], path)
            path.pop()

    backtrack(0, 0, [])

    if not found:
        print("-1")

if __name__ == "__main__":
    solve()