题目描述
解题思路
这题其实是0-1背包问题,但是附加了条件
具体思路就是构造物品类,然后对主件判断是否有附件,若有附件则依次添加,根据主件、附件1、附件2的组合有四种情况
- 只有主件
- 主件+附件1
- 主件+附件2
- 主件+附件1+附件2
根据以上情况转化问题为经典的 01背包问题 ,接着就是套公式动态规划即可
经典背包问题回顾
问题描述:有一个背包可以装物品的总重量为W,现有N个物品,每个物品中w[i],价值v[i],用背包装物品,能装的最大价值是多少?
定义状态转移数组dp[i][j]
,表示前i个物品,背包重量为j的情况下能装的最大价值。
例如,dp[3][4]=6
,表示用前3个物品装入重量为4的背包所能获得的最大价值为6,此时并不是3个物品全部装入,而是3个物品满足装入背包的条件下的最大价值。
状态转移方程:
dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]]+v[i])
dp[i-1][j]表示当前物品不放入背包,dp[i-1][j-w[i]]+v[i]
表示当前物品放入背包,即当前第i个物品要么放入背包,要么不放入背包。
dp = [[0]*(n+1) for _ in range(m+1)]
for i in range(1,m+1):
for j in range(1,n+1):
if j-w[i]>=0:
dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]]+v[i])
else:
dp[i][j] = dp[i-1