欢迎光临散文网 会员登陆 & 注册

刷题第十九天

2023-08-29 11:48 作者:叶荜莉  | 我要投稿

416. 分割等和子集:

这题可以转化为背包问题,先算出nums的总和,如果总和为奇数,返回false,否则总和的一半就是背包的容量target。dp[i][j]指在0-i中任取num,和小于等于j。最后返回target==dp[nums.size()-1][target]。

这里我用了一个dp小技巧,在nums前插入一个0,之后i从1开始遍历,这样做就不用对dp进行初始化。

1049. 最后一块石头的重量 II:

这题其实就是算出最接近平均值的和与平均值差多少,差的两倍就是答案。这样理解之后,解题思路就和416是一样的。

494. 目标和:

这题的背包就是sum-target再除2,如果背包不是整数或为负数,返回0。dp[i][j]指当前0-i中任选和为j的方法数。初始化当nums[0]==j时dp[0][j]++,再dp[0][0]++。然后遍历,dp[i][j]+=dp[i-1][j],dp[i][j]+=dp[i-1][j-nums[i]]。

474. 一和零:

这题首先要处理字符串,设置one和zero数组。设置了三维dp[i][j][k]表示0-i中选任意字符串,其中的0和1个数分别不超过j和k的最长组合。这题初始化和494是一个思路。


刷题第十九天的评论 (共 条)

分享到微博请遵守国家法律