代码随想录算法训练营Day 44| 动态规划part06 | 完全背包、518. 零钱兑换 II、377. 组合总和 Ⅳ
文章目录
完全背包理论基础
有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。
完全背包和01背包问题唯一不同的地方就是,每种物品有无限件。
一、法一
def solve(weight,value,bagweight):
dp=[0]*(bagweight+1)
for i in range(len(weight)):
for j in range(weight[i],bagweight+1):
dp[j]=max(dp[j],dp[j-weight[i]]+value[i])
return dp[bagweight]
data=list(map(int,input().split()))
N=data[0]
V=data[1]
import sys
weight=[]
value=[]
for line in sys.stdin:
w,v=list(map(int,line.split()))
weight.append(w)
value.append(v)
res=solve(weight,value,V)
print(res)
518. 零钱兑换 II
一、法一
class Solution(object):
def change(self, amount, coins):
"""
:type amount: int
:type coins: List[int]
:rtype: int
"""
# dp[j] 表示能凑到j的不同方法为dp[j]种
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[amount]
和目标和那道题很像,求组合数
377. 组合总和 Ⅳ
一、法一
class Solution(object):
def combinationSum4(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
#dp[j]表示和为j的元素组合的数量
dp=[0]*(target+1)
dp[0]=1
for j in range(target+1):
for i in range(len(nums)):
if j-nums[i]>=0:
dp[j]+=dp[j-nums[i]]
return dp[target]
与上题相比 这个是求排列数