day42|● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

news/2023/6/8 0:00:31

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

 

1.代码

class Solution {
public:int lastStoneWeightII(vector<int>& stones) {int sum = 0;for(int i: stones) {sum += i;}int t = sum;sum = sum /2;vector<int>f(sum + 1);for (int i = 0; i < stones.size(); i++) {for (int j = sum; j >= stones[i]; j--) {f[j] = max(f[j], f[j - stones[i]] + stones[i]); }}return t - f[sum] - f[sum];}
};

2.思考

根据题目的意思,就是不断抵消石头,直到抵消为一个石头时停止,有很多种抵消石头的方法,求出最后石头重量最小的抵消石头的方法的石头重量。

如何求呢?我们可以把这些石头看成两堆,两堆相减就是最后一个石头的重量了,因为会不断抵消,可以自己模拟一下。

所以求出中间值,那个方法分出的更小的那一堆最接近中间值就是正确的

就可以转化成01背包问题:选几个物品,求出不超过体积的最大价值

这道题和切割等和子集不同的是这道题是最接近中间值而不是等于中间值

3.动规五部曲

先求出中间值sum = sum/2 , 不用管奇数和偶数

1,确定dp数组的含义

dp[i]相当于最大体积为i时的最大价值,这里是从数组中挑几个值,不超过i的情况下值的总和是多少

2.确定递推公式

当取每一个物品时可以表现为取它还是不取它,

不取它:dp[j] = dp[j]

取它: dp[j] = dp[j - stones[i]] + stones[i] |这里的空间和值是相同的,取这个石头必须要留足够存放这个石头的空间

3.初始化

当小于当前取得物品时就不能取了,需要为0, 可以在遍历顺序中判断

4.确定遍历顺序

第一层循环是取出每一个石头放到不同的背包中,直到把所有石头放完为止

第二层就是遍历所有可以放的下当前石头的背包,确定要不要放当前石头,逆序遍历防止重复放石头,因为会复用之前遍历的背包

5.模拟


494. 目标和

1.代码

class Solution {
public:int findTargetSumWays(vector<int>& nums, int target) {int sum = 0;for (int i: nums) sum += i;//一共有nums.size个数,设加法总和为x, 减法的总和为 -(sum - x)if (abs(target) > sum) return 0;if ((target + sum) % 2 == 1) return 0;int x = (target + sum) / 2;vector<int>f(x + 1, 0);f[0]  = 1;for (int i = 0; i < nums.size(); i++) {for (int j = x; j >= nums[i]; j--) {f[j] += f[j - nums[i]];}}return f[x];}
};

2.思考

一个数组中每个元素可以变换符号,变换符号后每个元素相加等于目标值的个数有多少个,

可以看出一部分是正数,一部分是负数,但是正数和负数的值固定才能相加等于一个固定值,设正数值之和相加等于x,那么负数就能够确定为-{num-x},所以我们可以转化成,选出几个值相加,之和等于目标值的有多少个。可以用01背包求出

这是求个数

3.递归五部曲

1.确定dp数组和其含义

dp[i]代表相加后x等于j的次数

2.确定递推公式

因为加每一个物品时都有可能到达体积j,为了算出到达i的相加方案数,每次都需要加上f[j - nums[i]]这个方案数就能得到总方案数f[i] += f[i - nums[i]];

3.初始化

每次加不会加上而外的值,所以需要在前面初始化。几乎都是从f[0]得到的, f[0]代表到达0的方案数,所以为空集,f[0] = 1

4.遍历顺序

第一层是武品,第二层逆序背包

5.模拟


474. 一和零

1.代码

class Solution {
public:int findMaxForm(vector<string>& strs, int m, int n) {vector<vector<int>>f(m + 1, vector<int>(n + 1, 0));for (string str: strs) {int oneNum = 0;int zeroNum = 0;for (char ch: str) {if (ch == '0') zeroNum++;else oneNum++;}for (int i = m; i >= zeroNum; i--) {for (int j = n; j >= oneNum; j--) {f[i][j] = max(f[i][j], f[i - zeroNum][j - oneNum] + 1);} }}return f[m][n];}
};

 2.递归五部曲

1.确定dp数组和其含义

sp[i][j] 就是i个0和j个1的集合元素个数

2.确定递推公式

当每次拿物品时就会有一些0和一些1,要么选这个数要么不选就有两种方式

选f[i][j] = f[i - zeroNum][j - oneNum] + 1,增加一个元素

不选f[i][j] = f[i][j]

3.确定初始化

在遍历顺序中确定

4.遍历顺序

第一层就是遍历物品

第二层就是不超过总共的1和0的情况下遍历体积,

5.模拟

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-4567428.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

Vivado联合modelsim仿真卡在executing analysis and compilation step阶段

vivado使用modelsim仿真老是会有问题&#xff0c;我每次都会单纯在验证到底是哪个工具的问题上花好几天时间&#xff0c;总结下来几个点。 首先&#xff0c;如果一直卡住&#xff0c;那一定是有问题&#xff0c;不用再等了。如果不能仿真&#xff0c;那么从第一步开始检查&…

Modelsim仿真卡在loading的解决方法

目录 卡在图中这个位置 直接将安装目录下的lmutil.exe删除掉 网上常见的其他两种解决方法是&#xff1a; 1、将modelsim.ini中的VoptFlow的值改为0 2、关掉电脑的防火墙 卡在图中这个位置 直接将安装目录下的lmutil.exe删除掉 网上常见的其他两种解决方法是&#xff1a; 1…

ReactNative之 Activity class {xxx/xxx.MainActivity} does not exist

Activity class {xxx/xxx.MainActivity} does not exist 错误原因&#xff1a;MainActivity不在项目的根目录下边 解决方法&#xff1a; 打开对应的文件夹node_modules.react-native/local-cli/runAndroid/&#xff0c;找到runAndroid.js这个文件 修改对应的包文件下正确的路…

笔记本电脑找不到计算机配置,笔记本电脑收不到wifi的解决步骤_笔记本电脑搜不到wifi怎么设置-win7之家...

大家在使用笔记本电脑的时候&#xff0c;都会喜欢搜索无线wifi来连接网络上网&#xff0c;可是有不少笔记本电脑用户却反映说收不到wifi&#xff0c;导致无法连接上网&#xff0c;这该怎么办呢&#xff1f;其实只要简单设置一下就可以了&#xff0c;针对笔记本电脑搜不到wifi这…

台式计算机搜索不到无线信号,win7电脑搜不到无线信号怎么办_win7找不到无线网络怎么解决-win7之家...

有win7用户说他在连接无线的时候&#xff0c;却一直找不到要连的无线网络&#xff0c;也不知道是怎么导致的&#xff0c;相信有很多人跟这位用户一样也遇到了相同的问题&#xff0c;那么win7电脑搜不到无线信号怎么办呢&#xff0c;下面小编给大家分享win7电脑搜不到无线信号的…

解决电脑搜不到WiFi6无线路由信号问题,别人家的都能搜到自己家的搜不到

参考文章&#xff1a;解决电脑搜不到WiFi6无线路由信号问题 我的网卡也是Intel Dual Band Wireless-AC 3160&#xff0c;官网的驱动一顿操作猛如虎没更新成功。 去这个地址下了个&#xff0c;https://driverpack.io/zh-cn/devices/wifi/intel/intel-r-dual-band-wireless-ac…

如何轻松搞定 笔记本搜不到WIFI信号问题

经常用电脑的同志肯定遇到过&#xff1a;一开机&#xff0c;发现右下角网络图标有个号&#xff0c;wifi信号也搜不到&#xff1b;或者其他wifi信号能搜到&#xff0c;唯独自家的搜不到&#xff0c;是不是感觉很绝望啊&#xff0c;居然被wifi欺负到身上了&#xff0c;这也太憋屈…

【c51警告】*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS报错修改

*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS 出现这一串报错&#xff0c;打开魔术棒-->BL51 miso-->在框框里输入报错的编号&#xff0c;在这里是16-->完成