代码随想录算法训练营第三十七天| 52.携带研究材料、518.零钱兑换||、377.组合总和、

题目链接:52. 携带研究材料(第七期模拟笔试) (kamacoder.com)

m, n = map(int, input().split())

value = []
weight = []

for i in range(m):
    w, v = map(int, input().split())
    weight.append(w)
    value.append(v)
    
    
dp = [0] * (n + 1)

for i in range(m):
    for j in range(weight[i] ,n + 1):
        dp[j] = max(dp[j], dp[j-weight[i]] + value[i])
        
        
print(dp[n])

题目链接:518. 零钱兑换 II - 力扣(LeetCode)

思路:假设有1 2 5 conis 要凑成amount = 5

           所以

           coins[0] 加入遍历 0:1, (从这里开始)1:0 + dp[1 - coins[0]], 2:0 + dp[1-coins[0]] ....

           coins[1] 加入遍历 0:1, 1:1, (从这里开始)2:1 + dp[2-coins[0]] (1 +1的情况和2的情况)

所以递推方程为dp[j] = dp[j] + dp[j - coins[i]]

class Solution(object):
    def change(self, amount, coins):
        """
        :type amount: int
        :type coins: List[int]
        :rtype: 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] + dp[j - coins[i]]


        return dp[amount]

题目链接:377. 组合总和 Ⅳ - 力扣(LeetCode)

思路:这道题组成有顺序,所以先遍历物品再遍历重量是有讲究的。先遍历物品,再遍历背包,只会得到一种情况 例如{1, 5} 而不会出现 {5 ,1} ; 而先遍历背包,再遍历物品,则会出现(1,5) 和 (5,1)

class Solution(object):
    def combinationSum4(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """

        # 有目标值 且数组中的值可以放多次 考虑完全背包

        dp = [0] * (target + 1)

        dp[0] = 1

        for i in range(target + 1):
            for j in range(len(nums)):
                if nums[j] <= i:
                    dp[i] = dp[i] + dp[i - nums[j]] 


        return dp[target]

题目链接:57. 爬楼梯(第八期模拟笔试) (kamacoder.com)

思路:楼梯总数可以看成背包容量,爬的阶梯数量可以看成硬币或者是重量,并且可以重复使用,考虑完全背包


n, m = map(int, input().split())

dp = [0] * (n + 1)

dp[0] = 1

for i in range(n + 1):
    for j in range(1, m + 1):
        dp[i] = dp[i] + dp[i - j]
print(dp[n])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值