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)