python做网站前端,网站文案优化,进入淘宝官网网站,广告联盟app推广Leetcode 1049. 最后一块石头的重量 II
题目链接 1049 最后一块石头的重量 II
本题思路用一句话概括本题#xff1a;其实就是尽量让石头分成重量相同的两堆#xff0c;相撞之后剩下的石头最小。这样一看和前面的题目一个思路了#xff0c;下面上代码#xff1a;
class S…Leetcode 1049. 最后一块石头的重量 II
题目链接 1049 最后一块石头的重量 II
本题思路用一句话概括本题其实就是尽量让石头分成重量相同的两堆相撞之后剩下的石头最小。这样一看和前面的题目一个思路了下面上代码
class Solution {
public:int lastStoneWeightII(vectorint stones) {int sum 0;for(int i0;istones.size();i){sumstones[i];}int target;target sum/2;vectorint dp(15005,0);//初始化//dp[j]的含义是在容量为j的背包中取最大价值的石头for(int i0;istones.size();i){for(int jtarget;jstones[i];j--){dp[j] max(dp[j-stones[i]]stones[i],dp[j]);//这里价值和重量相等}}int result sum-dp[target]-dp[target];return result;}
};
Leetcode 494. 目标和
题目链接 494 目标和
本题目思路比较难想
如何转化为01背包问题呢。
假设加法的总和为x那么减法对应的总和就是sum - x。
所以我们要求的是 x - (sum - x) target
x (target sum) / 2
此时问题就转化为装满容量为x的背包有几种方法。
要注意dp的含义dp[j] 表示填满j包括j这么大容积的包有dp[j]种方法
自身感觉卡哥在视频中没讲清楚看了一下别人的讲解觉得不错
dp[j]dp[j]dp[j-nums[i]]
这个方程的意思是如果我们要用若干个元素组成和为j的方案数那么有两种选择不选第i个元素或者选第i个元素。如果不选第i个元素那么原来已经有多少种方案数就不变如果选第i个元素那么剩下要组成和为j - nums【i】 的方案数就等于dp[j - nums【i】]。所以两种选择相加就是dp【j】。
下面上代码
class Solution {
public:int findTargetSumWays(vectorint nums, int target) {int sum 0;for(int i0;inums.size();i){sumnums[i];}//两种情况的特判if(abs(target)sum){return 0;}//奇数不存在if((targetsum)%2 1){return 0;}int left (targetsum)/2;vectorint dp(left1,0);dp[0] 1;for(int i0;inums.size();i){for(int jleft;jnums[i];j--){//dp的含义是取j个元素能得到target的方案数dp[j]dp[j]dp[j-nums[i]];}}return dp[left];}
};
Leetcode 474. 一和零
题目链接 474 一和零
本题也是01背包只不过是两个维度就是一个三位数组下面上代码
class Solution {
public:int findMaxForm(vectorstring strs, int m, int n) {vectorvectorint dp(m1,vectorint (n1,0));for(string str : strs){int z 0;int y 0;for(char c : str){//遍历物品if(c 0){z;}else{y;}}for(int im;iz;i--){//遍历容量for(int jn;jy;j--){dp[i][j] max(dp[i-z][j-y]1,dp[i][j]);}}}return dp[m][n]; }
};
对于01背包又有点迷了上课回来还要仔细思考一下