01背包动态规划的递归解法,自己想了很久,没参考任何人的答案,但不幸的是会超时或者超空间,毕竟也是辛苦想出来的解法还是写一下。如果有改进意见的欢迎指正。
import functools
n, m = map(int, input().split())
price = []
content = []
nums = []
#输入数据处理
for line in range(m):
a = input().split()
price.append(int(a[0]))
content.append(int(a[1]))
nums.append(int(a[2]))
best = 0 # 计算公式为所购物品各自的价格×满意度之和
@functools.lru_cache(maxsize=None) #内存装饰器,按理可以缩短时间节省内存,但这里好像并没有什么帮助,仍然超时
def dfs(money, i, mask, scores, l):
global best
if money <= 0 or i == l:
return
if not mask & (1<<i) and money >= price[i]:#如果该物品不在清单并且剩余的钱够买
if nums[i] == 0 or (nums[i] != 0 and mask & (1<<(nums[i]-1))):#如果是主体,或者不是主体并且其主体已经在购物单里,只需购买这一件
m = money - price[i]
new_mask = mask | (1<<i)
sc = scores
sc += price[i]*content[i]
best = max(best, sc)
dfs(m, i + 1, new_mask, sc, l)
elif money - price[i] - price[nums[i]-1] >=0:#如果是附件,并且其主体也不在购物单里,剩余的钱也可以买两件,则买两件
m = money - price[i] - price[nums[i]-1]
new_mask = mask | (1<<i)
new_mask = new_mask | (1<<(nums[i]-1))
sc = scores
sc += price[i]*content[i] + price[nums[i]-1]*content[nums[i]-1]
best = max(best, sc)
dfs(m, i + 1, new_mask, sc, l)
dfs(money, i+1, mask, scores, l)
dfs(n, 0, 0, 0, m)
print(best)

京公网安备 11010502036488号