1049. 最后一块石头的重量 II
本题就和 昨天的 416. 分割等和子集 很像了,可以尝试先自己思考做一做。
视频讲解:动态规划之背包问题,这个背包最多能装多少?LeetCode:1049.最后一块石头的重量II_哔哩哔哩_bilibili
class Solution {
public:
int lastStoneWeightII(vector<int>& stones) {
vector<int>dp(15001,0);
int sum=0;for (int i=0;i<stones.size();i++)sum+=stones[i];
int target=sum/2;
for (int i=0;i<stones.size();i++){
for (int j=target;j>=stones[i];j--){
dp[j]=max(dp[j],dp[j-stones[i]]+stones[i]);
}
}
return sum-dp[target]*2;
}
};
总结
真没想到使用这种方式写的。
494. 目标和
大家重点理解 递推公式:dp[j] += dp[j - nums[i]],这个公式后面的提问 我们还会用到。
视频讲解:动态规划之背包问题,装满背包有多少种方法?| LeetCode:494.目标和_哔哩哔哩_bilibili
class Solution {
public:
int findTargetSumWays(vector<int>& nums, int target) {
int sum=0;for (int i=0;i<nums.size();i++)sum+=nums[i];
int x=(target+sum)/2;
if ((target+sum)%2==1)return 0;
if (abs(target)>sum)return 0;
vector<int>dp(x+1,0);
dp[0]=1;
for (int i=0;i<nums.size();i++){
for (int j=x;j>=nums[i];j--){
dp[j]+=dp[j-nums[i]];
}
}
return dp[x];
}
};
总结
背包的首要问题是找到一个目标,然后是记忆化遍历。
474.一和零
通过这道题目,大家先粗略了解, 01背包,完全背包,多重背包的区别,不过不用细扣,因为后面 对于 完全背包,多重背包 还有单独讲解。
视频讲解:动态规划之背包问题,装满这个背包最多用多少个物品?| LeetCode:474.一和零_哔哩哔哩_bilibili
class Solution {
public:
int findMaxForm(vector<string>& strs, int m, int n) {
vector<vector<int>>dp(m+1,vector<int>(n+1,0));
vector<pair<int,int>>nums(strs.size());
for (int i=0;i<strs.size();i++){
for (auto c:strs[i]){
if (c=='1')nums[i].first++;
else nums[i].second++;
}
}
for (int i=0;i<strs.size();i++){
for (int j=m;j>=nums[i].second;j--){
for (int z=n;z>=nums[i].first;z--){
dp[j][z]=max(dp[j][z],dp[j-nums[i].second][z-nums[i].first]+1);
}
}
}
return dp[m][n];
}
};