parent
14c8770633
commit
63280146bd
@ -0,0 +1,3 @@ |
|||||||
|
{ |
||||||
|
"python.analysis.autoImportCompletions": true |
||||||
|
} |
@ -0,0 +1 @@ |
|||||||
|
# 检验一个给定表达式中的括号是否正确匹配 |
@ -0,0 +1,66 @@ |
|||||||
|
from fractions import Fraction |
||||||
|
|
||||||
|
# 第五章 作业一 |
||||||
|
# 有分数1/2,1/3,1/4,1/5,1/6,1/8,1/10,1/12,1/15,求将其中若干个分数相加和恰好等于1的组成方案,并输出 |
||||||
|
# |
||||||
|
# 1. 给定的分数使用 Fraction 类型,可以方便地进行分数的计算和比较。 |
||||||
|
# |
||||||
|
# 2. 使用递归来查找满足条件的组合。参数: |
||||||
|
# - `target`:目标和,初始值为 1。 |
||||||
|
# - `current_combination`:当前已选择的分数组合,初始为空列表。 |
||||||
|
# - `index`:当前处理的分数在列表中的索引,初始为 0。 |
||||||
|
# |
||||||
|
# 3. 在递归函数中,有两个选择: |
||||||
|
# - 不选择当前分数:继续递归,不修改 `target` 和 `current_combination`。 |
||||||
|
# - 选择当前分数:继续递归,更新 `target` 为 `target - fractions[index]`,并将当前分数添加到 `current_combination` 中。 |
||||||
|
# |
||||||
|
# 4. 当 `target` 等于 0 时,我们找到了一个满足条件的组合,将其打印出来。 |
||||||
|
# |
||||||
|
# 5. 递归继续处理下一个分数,直到遍历完所有分数或找到所有满足条件的组合。 |
||||||
|
|
||||||
|
|
||||||
|
def find_combinations( |
||||||
|
target: Fraction, |
||||||
|
fractions: list[Fraction], |
||||||
|
current_combination: list[Fraction], |
||||||
|
index: int, |
||||||
|
resultSet: list[list[Fraction]], |
||||||
|
): |
||||||
|
if target == 0: |
||||||
|
resultSet.append(current_combination.copy()) |
||||||
|
return |
||||||
|
if index >= len(fractions): |
||||||
|
return |
||||||
|
|
||||||
|
# 不选择当前分数 |
||||||
|
find_combinations(target, fractions, current_combination, index + 1, resultSet) |
||||||
|
# 选择当前分数 |
||||||
|
find_combinations( |
||||||
|
target - fractions[index], |
||||||
|
fractions, |
||||||
|
current_combination + [fractions[index]], |
||||||
|
index + 1, |
||||||
|
resultSet, |
||||||
|
) |
||||||
|
|
||||||
|
|
||||||
|
fractions = [ |
||||||
|
Fraction(1, 2), |
||||||
|
Fraction(1, 3), |
||||||
|
Fraction(1, 4), |
||||||
|
Fraction(1, 5), |
||||||
|
Fraction(1, 6), |
||||||
|
Fraction(1, 8), |
||||||
|
Fraction(1, 10), |
||||||
|
Fraction(1, 12), |
||||||
|
Fraction(1, 15), |
||||||
|
] |
||||||
|
|
||||||
|
result_set = [] |
||||||
|
|
||||||
|
find_combinations( |
||||||
|
target=1, fractions=fractions, current_combination=[], index=0, resultSet=result_set |
||||||
|
) |
||||||
|
|
||||||
|
for result in result_set: |
||||||
|
print(" + ".join(map(str, result)) + " = 1") |
@ -0,0 +1,36 @@ |
|||||||
|
# 第五章 作业3 |
||||||
|
# 找出所有由1~9组成的9位数,每个数字只能出现一次,且这个9位数由高位到低位前i位能被i整除 |
||||||
|
# |
||||||
|
# 1. 使用深度优先搜索(DFS)来查找满足条件的 9 位数。 |
||||||
|
# |
||||||
|
# 2. 定义一个 `dfs` 函数,两个参数: |
||||||
|
# - `k`:当前已选择的数字个数,初始值为 0。 |
||||||
|
# - `num`:当前已选择的数字组成的整数,初始值为 0。 |
||||||
|
# |
||||||
|
# 3. 在 `dfs` 函数中,遍历数字 1 到 9。对于每个数字,检查是否已经使用过(通过 `used` 数组判断)。如果没有使用过,我们尝试将该数字添加到当前的数字组合中。 |
||||||
|
# |
||||||
|
# 4. 检查当前数字组合是否满足条件:前 i 位能被 i 整除。如果满足条件,我们继续递归调用 `dfs`,更新 `k` 和 `num`。 |
||||||
|
# |
||||||
|
# 5. 当 `k` 等于 9 时,找到了一个满足条件的 9 位数。 |
||||||
|
|
||||||
|
|
||||||
|
def find(k: int, num: int, used: list[bool], resultSet: list[int]): |
||||||
|
if k != 0 and num % k != 0: |
||||||
|
return |
||||||
|
|
||||||
|
if k == 9: |
||||||
|
resultSet.append(num) |
||||||
|
return |
||||||
|
|
||||||
|
# digit: 1 ~ 9 |
||||||
|
for digit in range(1, 10): |
||||||
|
if not used[digit]: |
||||||
|
used[digit] = True |
||||||
|
find(k + 1, num * 10 + digit, used, resultSet) |
||||||
|
# 当前数字撤销使用标记,以便下一个数字的搜索时可用 |
||||||
|
used[digit] = False |
||||||
|
|
||||||
|
|
||||||
|
resultSet = [] |
||||||
|
find(0, 0, [False] * 10, resultSet) |
||||||
|
print(resultSet) |
@ -0,0 +1,7 @@ |
|||||||
|
# 翻币问题:有N个硬币(N≥10),正面向上排成一排。每次必须翻5个硬币,直到全部反面向上。 |
||||||
|
|
||||||
|
def flip_coins(num: int): |
||||||
|
pass |
||||||
|
|
||||||
|
result = flip_coins(21) |
||||||
|
print(result) |
@ -0,0 +1,75 @@ |
|||||||
|
# 等分液体 |
||||||
|
# 在一个瓶子中装有8(一般情形下为偶数N)升汽油,要平均分成两份, |
||||||
|
# 但只有一个装3(一般情形下为N/2-1)升和装5(一般情形下为N/2+1)升的量杯(都没有刻度)。 |
||||||
|
# 若有解,则打印出所有把汽油分成两等分的操作过程。若无解,则打印“No”。 |
||||||
|
|
||||||
|
from collections import deque |
||||||
|
|
||||||
|
|
||||||
|
def pour(source, target, target_capacity): |
||||||
|
amount = min(source, target_capacity - target) |
||||||
|
return source - amount, target + amount |
||||||
|
|
||||||
|
|
||||||
|
def get_next_states(state, capacities): |
||||||
|
next_states = [] |
||||||
|
bottle, cup3, cup5 = state |
||||||
|
max_bottle, max_cup3, max_cup5 = capacities |
||||||
|
|
||||||
|
# bottle -> cup3 |
||||||
|
next_states.append(pour(bottle, cup3, max_cup3) + (cup5,)) |
||||||
|
# bottle -> cup5 |
||||||
|
next_states.append(pour(bottle, cup5, max_cup5) + (cup3,)) |
||||||
|
# cup3 -> bottle |
||||||
|
next_states.append( |
||||||
|
(pour(cup3, bottle, max_bottle)[1],) + pour(cup3, bottle, max_bottle) |
||||||
|
) |
||||||
|
# cup5 -> bottle |
||||||
|
next_states.append( |
||||||
|
(pour(cup5, bottle, max_bottle)[1], cup3, pour(cup5, bottle, max_bottle)[0]) |
||||||
|
) |
||||||
|
# cup3 -> cup5 |
||||||
|
next_states.append((bottle,) + pour(cup3, cup5, max_cup5)) |
||||||
|
# cup5 -> cup3 |
||||||
|
next_states.append((bottle,) + pour(cup5, cup3, max_cup3)[::-1]) |
||||||
|
|
||||||
|
return next_states |
||||||
|
|
||||||
|
|
||||||
|
def bfs(initial_state, capacities, target): |
||||||
|
queue = deque([(initial_state, [])]) |
||||||
|
visited = set() |
||||||
|
|
||||||
|
while queue: |
||||||
|
(state, path) = queue.popleft() |
||||||
|
|
||||||
|
if (state[0] == target and state[1] == target) or ( |
||||||
|
state[0] == target and state[2] == target |
||||||
|
): |
||||||
|
return path |
||||||
|
|
||||||
|
if state in visited: |
||||||
|
continue |
||||||
|
|
||||||
|
visited.add(state) |
||||||
|
|
||||||
|
for next_state in get_next_states(state, capacities): |
||||||
|
if next_state not in visited: |
||||||
|
queue.append((next_state, path + [next_state])) |
||||||
|
|
||||||
|
return "No" |
||||||
|
|
||||||
|
|
||||||
|
N = 8 |
||||||
|
capacities = (N, N // 2 - 1, N // 2 + 1) |
||||||
|
initial_state = (N, 0, 0) |
||||||
|
target = N // 2 |
||||||
|
|
||||||
|
result = bfs(initial_state, capacities, target) |
||||||
|
|
||||||
|
if result == "No": |
||||||
|
print("No") |
||||||
|
else: |
||||||
|
print("状态步骤:(汽油瓶, 5L杯, 3L杯)") |
||||||
|
for step in result: |
||||||
|
print(step) |
@ -0,0 +1,46 @@ |
|||||||
|
# 一个正整数有可能可以被表示为n(n≥2)个连续的正整数之和,如n=15时, |
||||||
|
# 15=1+2+3+4+5 |
||||||
|
# 15=4+5+6 |
||||||
|
# 15=7+8 |
||||||
|
# 请编写算法,根据输入的任何一个正整数,找出符合这种要求的所有连续正整数序列。 |
||||||
|
|
||||||
|
# 需要找到所有可能的连续正整数序列,这些序列的和等于给定的正整数 N 。 |
||||||
|
# 考虑到一个连续的正整数序列 a, a+1, a+2, ..., a+(k-1) ,和可以表示为: |
||||||
|
# |
||||||
|
# S = a + (a + 1) + (a + 2) + ... + (a + k - 1) |
||||||
|
# |
||||||
|
# 简化为: |
||||||
|
# |
||||||
|
# S = k * a + (k*(k - 1)) / 2 |
||||||
|
# |
||||||
|
# S 是给定的正整数 N,a 是序列的起始数,k 是序列中的项数。 |
||||||
|
# |
||||||
|
# 所以有: |
||||||
|
# |
||||||
|
# N = k * a + (k*(k - 1)) / 2 |
||||||
|
# |
||||||
|
# 即: |
||||||
|
# |
||||||
|
# 2N = k * (2a + k - 1) |
||||||
|
# |
||||||
|
# 为了找到所有满足条件的序列,从 2 开始遍历可能的 k 值,直到 k*(k-1) < 2N为止,检查是否有整数 a 使得上面的等式成立。 |
||||||
|
|
||||||
|
|
||||||
|
def find_consecutive_sequences(N): |
||||||
|
result = [] |
||||||
|
|
||||||
|
k = 2 |
||||||
|
while k * (k - 1) < 2 * N: |
||||||
|
if (2 * N - k * (k - 1)) % (2 * k) == 0: |
||||||
|
a = (2 * N - k * (k - 1)) // (2 * k) |
||||||
|
sequence = [a + i for i in range(k)] |
||||||
|
result.append(sequence) |
||||||
|
k += 1 |
||||||
|
|
||||||
|
return result |
||||||
|
|
||||||
|
|
||||||
|
N = 15 |
||||||
|
sequences = find_consecutive_sequences(N) |
||||||
|
for seq in sequences: |
||||||
|
print(seq) |
Loading…
Reference in new issue