1049.最后一个石头的重量II

思路:

有题目可知总体还是类似于背包问题
1.定义出total=总石头的重量和,在定义变量n,m分别为数组stones长度一半(类似于背包总容量)和总重量一半。
2.定义dp[][]二维数组,其含义为:dp[i][j]为第i个石头的重量为j
3.初始化,将定义的二维数组列表全初始化为False,将的dp[0][0]初始化为True
4.确定遍历范围,在i数组中将其全部元素遍历即range(n),在j数组里时需将遍历m个元素,且从第一个元素开始
5.将判断条件公式化,j<stoens[i]时,第i+1个石头的重量=第i个石头的重量
同理当j>=stones[i]时一是同理。
最后返回值
class Solution:
    def lastStoneweight(self, stones: list[int]) -> int:
        total = sum(stones)  # 计算石头的总重量
        n, m = len(stones), total // 2  # 计算石头数量和总重量的一半
        dp = [[False] * (m + 1) for _ in range(n + 1)]  # 初始化动态规划数组
        dp[0][0] = True  # 初始状态为True
        for i in range(n):  # 遍历石头
            for j in range(1, m + 1):  # 遍历总重量的一半
                if j < stones[i]:
                    dp[i + 1][j] = dp[i][j]
                else:
                    dp[i + 1][j] = dp[i][j] or dp[i][j - stones[i]]
        ans = None
        for j in range(m, -1, -1):  # 从总重量的一半开始逆序遍历
            if dp[n][j]:  # 找到最大的满足条件的重量
                ans = total - 2 * j
                break
        return ans  # 返回结果

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值