202209-2-何以包邮?
问题
思路一:类穷举,结合set集合
枚举出所有的组合的总价格,再取满足包邮的最小总价格(100分 ):
搜索发现此题多用递归,动态规划(0-1背包)实现,自己尝试用枚举(set集合结合类似穷举的方式)居然也100分了
⚠️:关键点——
set集合
、
- 书的价格列表,价格由低到高排序
- 用set集合优化重复的组合的总价格
- 遍历书的价格列表,后面组合的总价格基于前面的组合的总价格的集合
![]()
实现
n, x = map(int, input().split()) # n为购物车中图书数量,x为包邮价格条件
a = [0 for _ in range(n)] # 书的价格列表(价格由低到高)
for i in range(n):
a[i] = int(input().strip())
a.sort()
# 枚举出所有的可能价格
cost_set = set() # 存储各种搭配的价格
temp_list = [] # 暂存价格(避免循环时改变迭代器)
for i in a:
if i == a[0]: # 最小的,加入即完毕
cost_set.add(i)
continue
for j in cost_set: # 把可能的情况暂存,避免循环时改变迭代器
temp_list.append(i+j)
for k in temp_list:
cost_set.add(k)
cost_set.add(i) # 注意,最后加自己
# 找恰大于x的值
for i in sorted(list(cost_set)):
if i >= x:
print(i)
break
1、
strip()
和split()
strip()
: 去掉字符串中的空白字符(包括换行符、制表符、空格等)。
split()
: 将字符串按照指定分隔符分割成多个子串,并返回一个列表。如果不指定分隔符,则默认使用空白字符(包括换行符、制表符、空格等)作为分隔符。
思路二:类0-1背包动态规划
⚠️有点巧妙,求最大的总价格,从而转换为简化的0-1背包
- 传统0-1背包有n种物品,每种物品有价值和重量,总重量不超过容量情况下,使得总价值最大
- 前i个物品放入容量为j的背包中所获得的最大价值
- 本题n本书,每本书有价值,选取的总价格不超过 sum - 包邮价格x,使得总价格最大
- 前i个物品放入总价为j的背包中所获得的最大价值
方法一:二维数组、建立n个物品 * 最大价格 的二维数组
方法二:一维数组、定一个数组,长度为
sum()
,求对应的书本的总价格
实现
一维数组——正序
n, x = map(int, input().split()) # n为购物车中图书数量,x为包邮价格条件
a = [0] + [0 for _ in range(n)] # 书的价格列表(价格由低到高)
for i in range(1, n+1):
a[i] = int(input().strip())
total = sum(a) # 最大价格
matrix = [