已知集合I={1,2,3,4,5,6},A={(s,t)|s ∈I,t∈I},若B包含于A,且对任意的(a,b)∈B,(x,y)∈B,均有(a-x)(b-y)<=0,则集合B中元素个数的最大值是几?
用“在单个元素集合中逐个添加元素,直到无法添加满足条件的元素”的算法编写程序求出当元素个数最大时,所有可能的集合B,要求集合I的元素个数可作为参数。
他给出的程序是:
def find_maximal_subsets(n):
"""
使用逐步添加元素的方法找到所有满足条件的最大子集 B
"""
all_points = [(i, j) for i in range(1, n + 1) for j in range(1, n + 1)]
def satisfies_condition(point, subset):
"""检查新点 point 是否能加入子集 subset 而满足条件"""
a, b = point
for (x, y) in subset:
if (a - x) * (b - y) > 0:
return False
return True
max_size = 0
maximal_subsets = []
def backtrack(current_set, available_points, start_idx):
nonlocal max_size
# 检查是否能成为新的最大子集
if len(current_set) > max_size:
max_size = len(current_set)
maximal_subsets.clear()
maximal_subsets.append(set(current_set))
elif len(current_set) == max_size:
maximal_subsets.append(set(current_set))
# 尝试添加新元素
for i in range(start_idx, len(available_points)):
point = available_points[i]
if satisfies_condition(point, current_set):
current_set.append(point)
backtrack(current_set, available_points, i + 1)
current_set.pop()
# 从每个点开始搜索
for start_point in all_points:
backtrack([start_point], all_points, all_points.index(start_point) + 1)
# 去重
unique_subsets = []
seen = set()
for s in maximal_subsets:
key = tuple(sorted(s))
if key not in seen:
seen.add(key)
unique_subsets.append(s)
return unique_subsets, max_size
def main():
n = 6 # 可以修改这个参数
print(f"I = {{1, 2, ..., {n}}}")
print("使用逐步添加算法寻找最大子集...")
result, max_size = find_maximal_subsets(n)
print(f"\n最大元素个数: {max_size}")
print(f"找到 {len(result)} 个满足条件的最大集合 B:")
for i, B in enumerate(result, 1):
print(f"{i}: {sorted(B)}")
if __name__ == "__main__":
main()
运行结果
python3 set6a.py
I = {1, 2, ..., 3}
使用逐步添加算法寻找最大子集...
最大元素个数: 5
找到 6 个满足条件的最大集合 B:
1: [(1, 1), (1, 2), (1, 3), (2, 1), (3, 1)]
2: [(1, 2), (1, 3), (2, 1), (2, 2), (3, 1)]
3: [(1, 2), (1, 3), (2, 2), (3, 1), (3, 2)]
4: [(1, 3), (2, 1), (2, 2), (2, 3), (3, 1)]
5: [(1, 3), (2, 2), (2, 3), (3, 1), (3, 2)]
6: [(1, 3), (2, 3), (3, 1), (3, 2), (3, 3)]
python3 set6a.py
I = {1, 2, ..., 5}
使用逐步添加算法寻找最大子集...
最大元素个数: 9
找到 70 个满足条件的最大集合 B:
python3 set6a.py
I = {1, 2, ..., 6}
使用逐步添加算法寻找最大子集...
最大元素个数: 11
找到 252 个满足条件的最大集合 B:

1090

被折叠的 条评论
为什么被折叠?



