完全背包每个物品有无限多个,遍历顺序从小到大
此时遍历物品和遍历背包无所谓
def fullbiebao(weight,value,bag):
dp=[0]*(bag+1)
for i in range(len(weight)):
for j in range(weight[i],bag+1):
dp[j]=max(dp[j],dp[j-weight[i]]+value[i])
return dp[-1]
求完全背包的组合数 物品在外循环,容量在内循环 相当于物品排序不会重复
但从小到大排,本物品可以无限使用
class Solution:
def change(self, amount: int, coins: List[int]) -> int:
dp=[0]*(amount+1)
dp[0]=1
for i in range(len(coins)):
for j in range(coins[i],amount+1):
dp[j]+=dp[j-coins[i]]
return dp[-1]
排列要先遍历物品后遍历背包 所以加一个下标的判断
class Solution:
def combinationSum4(self, nums: List[int], target: int) -> int:
dp=[0]*(target+1)
dp[0]=1
for j in range(1,target+1):
for i in range(len(nums)):
if j>=nums[i]:
dp[j]+=dp[j-nums[i]]
return dp[-1]