如果 n 变为 0,这意味着当前的 cur 数组是 N 的一个有效划分,因为加起来正好等于 N。将这个划分作为元组添加到结果列表 res 中,并返回。
循环遍历从 st(起始索引)到 len(nums) 的所有整数。每次循环,选择一个数 nums[i-1] 并从 n 中减去这个数,表示将这个数纳入当前划分。
递归的调用:如果 nums[i-1] 小于或等于 n,这意味着我们可以将这个数作为当前划分的一部分。我们递归地调用 fn,传递新的 n 值(n - nums[i-1]),索引 i(确保不会选择小于当前数字的数字,从而避免重复),以及更新的当前划分 cur + [nums[i-1]]。
避免重复的划分:通过在每次递归调用中传递 i 作为起始索引,我们确保不会出现重复的划分。这是因为我们总是选择当前数字或更大的数字,从而保持了划分中数字的顺序。
结束递归:当我们尝试所有可能的数字,并且 n 不再减少到 0,递归调用将结束。如果 n 变为负数,我们不做任何事情就返回,因为这意味着当前的划分无法加起来等于 N。
整个过程可以视为一棵树,其中每个节点代表一个划分的决策。DFS 遍历这棵树,探索所有可能的路径,即整数 N 的所有可能划分。
res[0:len(res)-1] 从结果列表 res 中省略了最后一个元素。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13
N = eval(input()) nums = [i for i inrange(1, N + 1)] res = [] deffn(n, st, cur): if n < 0: return if n == 0: res.append(cur) return for i inrange(st, len(nums)): fn(n - nums[i], i, cur + [nums[i]]) fn(N, 0, []) print(res[0:len(res)-1])
n = int(input()) ls = list(map(int, input().split())) defmerge_sort(l,r): if l>=r: return mid = (l+r)//2 merge_sort(l,mid) merge_sort(mid+1,r) i,j = l,mid+1 tmp = [] while i<=mid and j<=r and i<=j: if ls[i]<ls[j]: tmp.append(ls[i]) i+=1 else: tmp.append(ls[j]) j+=1 while j<=r: tmp.append(ls[j]) j+=1 while i<=mid: tmp.append(ls[i]) i+=1 for i inrange(l, r + 1): # 注意 ls[i] = tmp[i - l]
merge_sort(0, len(ls) - 1) print(" ".join(str(i) for i in ls))
n = int(input()) ls = list(map(int, input().split())) defsort(l, r): if l >= r: return i = l - 1 j = r + 1 import random val = ls[random.randint(l,r)] while i < j: i += 1 while i < r and ls[i] < val: i += 1 j -= 1 while j > l and ls[j] > val: j -= 1 if i < j: ls[i], ls[j] = ls[j], ls[i] sort(l, j) sort(j + 1, r) sort(0, len(ls) - 1) print(" ".join(str(i) for i in ls))
#O(N*3) ls = eval(input()) defcalc(): n = len(ls) # 检查是否所有元素都是负数 ifall(x < 0for x in ls): return [max(ls)] cmax = -float('inf') res = [] # 遍历所有可能长度的子数组 for l inrange(n): for r inrange(l,n): tmp_ls = ls[l:r+1] tmp_sum = sum(tmp_ls) if tmp_sum > cmax: cmax = tmp_sum res = tmp_ls return res print(calc()) ls = [-1, 2, 3, -1] print(calc()) ls = [2, 3, -4, 5, -1, -10, 4, 3] print(calc()) ls = [-1, -2] print(calc())
=========5========== D1 D2 D3 D4 D5 D6 D7 1 2 3 4 5 R R R 2 1 4 3 R 5 R R 3 4 1 2 R R 5 R 4 3 2 1 R R R 5 5 R R R 1 2 3 4 =====================
=========6========== D1 D2 D3 D4 D5 D6 D7 1 2 3 4 5 6 R R 2 1 4 3 6 5 R R 3 4 1 2 R R 5 6 4 3 2 1 R R 6 5 5 6 R R 1 2 3 4 6 5 R R 2 1 4 3 =====================
=========7========== D1 D2 D3 D4 D5 D6 D7 1 2 3 4 5 6 7 R 2 1 4 3 6 5 R 7 3 4 1 2 7 R 5 6 4 3 2 1 R 7 6 5 5 6 7 R 1 2 3 4 6 5 R 7 2 1 4 3 7 R 5 6 3 4 1 2 =====================
=========9========== D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15 1 2 3 4 5 6 7 8 9 R R R R R R R 2 1 4 3 6 5 8 7 R 9 R R R R R R 3 4 1 2 7 8 5 6 R R 9 R R R R R 4 3 2 1 8 7 6 5 R R R 9 R R R R 5 6 7 8 1 2 3 4 R R R R 9 R R R 6 5 8 7 2 1 4 3 R R R R R 9 R R 7 8 5 6 3 4 1 2 R R R R R R 9 R 8 7 6 5 4 3 2 1 R R R R R R R 9 9 R R R R R R R 1 2 3 4 5 6 7 8 =====================
=========10========== D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15 1 2 3 4 5 6 7 8 9 10 R R R R R R 2 1 4 3 6 5 8 7 10 9 R R R R R R 3 4 1 2 7 8 5 6 R R 9 10 R R R R 4 3 2 1 8 7 6 5 R R 10 9 R R R R 5 6 7 8 1 2 3 4 R R R R 9 10 R R 6 5 8 7 2 1 4 3 R R R R 10 9 R R 7 8 5 6 3 4 1 2 R R R R R R 9 10 8 7 6 5 4 3 2 1 R R R R R R 10 9 9 10 R R R R R R 1 2 3 4 5 6 7 8 10 9 R R R R R R 2 1 4 3 6 5 8 7 =====================
=========11========== D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15 1 2 3 4 5 6 7 8 9 10 11 R R R R R 2 1 4 3 6 5 8 7 10 9 R 11 R R R R 3 4 1 2 7 8 5 6 11 R 9 10 R R R R 4 3 2 1 8 7 6 5 R 11 10 9 R R R R 5 6 7 8 1 2 3 4 R R R R 9 10 11 R 6 5 8 7 2 1 4 3 R R R R 10 9 R 11 7 8 5 6 3 4 1 2 R R R R 11 R 9 10 8 7 6 5 4 3 2 1 R R R R R 11 10 9 9 10 11 R R R R R 1 2 3 4 5 6 7 8 10 9 R 11 R R R R 2 1 4 3 6 5 8 7 11 R 9 10 R R R R 3 4 1 2 7 8 5 6 =====================
=========12========== D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15 1 2 3 4 5 6 7 8 9 10 11 12 R R R R 2 1 4 3 6 5 8 7 10 9 12 11 R R R R 3 4 1 2 7 8 5 6 11 12 9 10 R R R R 4 3 2 1 8 7 6 5 12 11 10 9 R R R R 5 6 7 8 1 2 3 4 R R R R 9 10 11 12 6 5 8 7 2 1 4 3 R R R R 10 9 12 11 7 8 5 6 3 4 1 2 R R R R 11 12 9 10 8 7 6 5 4 3 2 1 R R R R 12 11 10 9 9 10 11 12 R R R R 1 2 3 4 5 6 7 8 10 9 12 11 R R R R 2 1 4 3 6 5 8 7 11 12 9 10 R R R R 3 4 1 2 7 8 5 6 12 11 10 9 R R R R 4 3 2 1 8 7 6 5 =====================
=========13========== D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15 1 2 3 4 5 6 7 8 9 10 11 12 13 R R R 2 1 4 3 6 5 8 7 10 9 12 11 R 13 R R 3 4 1 2 7 8 5 6 11 12 9 10 R R 13 R 4 3 2 1 8 7 6 5 12 11 10 9 R R R 13 5 6 7 8 1 2 3 4 13 R R R 9 10 11 12 6 5 8 7 2 1 4 3 R 13 R R 10 9 12 11 7 8 5 6 3 4 1 2 R R 13 R 11 12 9 10 8 7 6 5 4 3 2 1 R R R 13 12 11 10 9 9 10 11 12 13 R R R 1 2 3 4 5 6 7 8 10 9 12 11 R 13 R R 2 1 4 3 6 5 8 7 11 12 9 10 R R 13 R 3 4 1 2 7 8 5 6 12 11 10 9 R R R 13 4 3 2 1 8 7 6 5 13 R R R 9 10 11 12 5 6 7 8 1 2 3 4 =====================
=========14========== D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15 1 2 3 4 5 6 7 8 9 10 11 12 13 14 R R 2 1 4 3 6 5 8 7 10 9 12 11 14 13 R R 3 4 1 2 7 8 5 6 11 12 9 10 R R 13 14 4 3 2 1 8 7 6 5 12 11 10 9 R R 14 13 5 6 7 8 1 2 3 4 13 14 R R 9 10 11 12 6 5 8 7 2 1 4 3 14 13 R R 10 9 12 11 7 8 5 6 3 4 1 2 R R 13 14 11 12 9 10 8 7 6 5 4 3 2 1 R R 14 13 12 11 10 9 9 10 11 12 13 14 R R 1 2 3 4 5 6 7 8 10 9 12 11 14 13 R R 2 1 4 3 6 5 8 7 11 12 9 10 R R 13 14 3 4 1 2 7 8 5 6 12 11 10 9 R R 14 13 4 3 2 1 8 7 6 5 13 14 R R 9 10 11 12 5 6 7 8 1 2 3 4 14 13 R R 10 9 12 11 6 5 8 7 2 1 4 3 =====================
defprint_res(n): print(" ", end="") for i inrange(1, n): print(f"D{i} ", end="") print() for i inrange(1, N + 1): for j inrange(1, n + 1): if mp[i][j] > N: print("R ", end="") else: print(f"{mp[i][j]:<4}", end="") print()
definit(): global N n = N if (n & (n - 1)) != 0: n = 2 ** math.ceil(math.log2(n))
solve(n) # debug_print() print_res(n)
if __name__ == "__main__": for i inrange(2, 17): N = i print(f"========={i}==========") init() print("=====================")