代码随想录算法训练营第四十二天

news/2024/11/13 10:45:31/

我家娃可太好看了,有点担心月嫂走了没法照顾娃。

明天没有新的题,所以我今天开个头吧。又懒了。

 01背包问题 二维

思路看了一遍,默写一下哈。甚至看了两遍,但是还没开始搞。。。振作起来!!!

目前看就是核心那一行有点问题,具体看备注吧,然后就是把验证代码也放上来了。

#include <iostream>
#include <vector>
using namespace ::std;
int main()
{int n;int bagweight;cin >> n;cin >> bagweight;// cout << "n是  " << n << endl;// cout << "bagweight  " << bagweight << endl;vector<int> weight(n, 0);vector<int> value(n, 0);for (int i = 0; i < n; i++){cin >> weight[i];}for (int i = 0; i < n; i++){cin >> value[i];}// test// for (int i = 0; i < n; i++)// {//     cout << "weight是  " << weight[i] << endl;//     cout << "value是  " << value[i] << endl;// }vector<vector<int>> dp(n, vector<int>(bagweight + 1, 0));for (int j = weight[0]; j <= bagweight; j++){dp[0][j] = value[0];}for (int i = 1; i < n; i++){for (int j = 0; j <= bagweight; j++){if (weight[i] > j){//这行实际上也做了第0列,第i行的赋值。dp[i][j] = dp[i - 1][j];}else{//要考虑 j - weight[i] 是前一个价值可能性dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); }}}// for (int i = 0; i < n; i++)// {//     for (int j = 0; j < bagweight; j++)//     {//         cout << " " << dp[i][j];//     }//     cout << endl;// }cout << dp[n-1][bagweight];return 0;
}

随想录的写法学习一下。


//二维dp数组实现
#include <bits/stdc++.h>
using namespace std;int n, bagweight;// bagweight代表行李箱空间
void solve() {vector<int> weight(n, 0); // 存储每件物品所占空间vector<int> value(n, 0);  // 存储每件物品价值for(int i = 0; i < n; ++i) {cin >> weight[i];}for(int j = 0; j < n; ++j) {cin >> value[j];}// dp数组, dp[i][j]代表行李箱空间为j的情况下,从下标为[0, i]的物品里面任意取,能达到的最大价值vector<vector<int>> dp(weight.size(), vector<int>(bagweight + 1, 0));// 初始化, 因为需要用到dp[i - 1]的值// j < weight[0]已在上方被初始化为0// j >= weight[0]的值就初始化为value[0]for (int j = weight[0]; j <= bagweight; j++) {dp[0][j] = value[0];}for(int i = 1; i < weight.size(); i++) { // 遍历科研物品for(int j = 0; j <= bagweight; j++) { // 遍历行李箱容量// 如果装不下这个物品,那么就继承dp[i - 1][j]的值if (j < weight[i]) dp[i][j] = dp[i - 1][j];// 如果能装下,就将值更新为 不装这个物品的最大值 和 装这个物品的最大值 中的 最大值// 装这个物品的最大值由容量为j - weight[i]的包任意放入序号为[0, i - 1]的最大值 + 该物品的价值构成else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);}}cout << dp[weight.size() - 1][bagweight] << endl;
}int main() {while(cin >> n >> bagweight) {solve();}return 0;
}

 01背包问题 一维 

一维需要从后往前整,浅试了一下,然后发现背包要从0开始,因为没有初始化i = 0的情况

#include <iostream>
#include <vector>
using namespace ::std;
int main()
{int n;int bagweight;cin >> n;cin >> bagweight;// cout << "n是  " << n << endl;// cout << "bagweight  " << bagweight << endl;vector<int> weight(n, 0);vector<int> value(n, 0);for (int i = 0; i < n; i++){cin >> weight[i];}for (int i = 0; i < n; i++){cin >> value[i];}// test// for (int i = 0; i < n; i++)// {//     cout << "weight是  " << weight[i] << endl;//     cout << "value是  " << value[i] << endl;// }vector<int> dp(bagweight + 1,0);for (int i = 0; i < n; i++){for (int j = bagweight; j >= weight[i]; j--){dp[j] = max(dp[j], dp[j - weight[i]] + value[i]); }}//for (int j = 0; j < bagweight; j++)//{//    cout << " " << dp[i][j];//}//cout << endl;cout << dp[bagweight];return 0;
}

 416. 分割等和子集 

力扣啦,能少整点东西。他的思路是用背包,重量和价值相同。

套路我自己其实还是有点想不到:

  • 背包的体积为sum / 2
  • 背包要放入的商品(集合里的元素)重量为 元素的数值,价值也为元素的数值
  • 背包如果正好装满,说明找到了总和为 sum / 2 的子集。
  • 背包中每一个元素是不可重复放入。
class Solution {
public:bool canPartition(vector<int>& nums) {int sum = 0;for(int i = 0;i < nums.size();i++){sum += nums[i];}if(sum % 2 != 0)return false;vector<int>dp(sum/2 + 1,0);for(int i = 0;i < nums.size();i++){for(int j = sum/2;j >= nums[i];j--){dp[j] = max(dp[j],dp[j - nums[i]] + nums[i]);}}return (dp[sum/2] == sum/2);}
};

随想录和我做的差不多,我就不贴上来了,欠的债还了,还有今天的没做!!加油!!


http://www.ppmy.cn/news/1453404.html

相关文章

【论文阅读笔记】Order Matters(AAAI 20)

个人博客地址 注&#xff1a;部分内容参考自GPT生成的内容 论文笔记&#xff1a;Order Matters&#xff08;AAAI 20&#xff09; 用于二进制代码相似性检测的语义感知神经网络 论文:《Order Matters: Semantic-Aware Neural Networks for Binary Code Similarity Detection》…

深度解析Java 9核心新特性

码到三十五 &#xff1a; 个人主页 < 免责声明 > 避免对文章进行过度解读&#xff0c;因为每个人的知识结构和认知背景都不同&#xff0c;没有一种通用的解决方案。对于文章观点&#xff0c;不必急于评判。融入其中&#xff0c;审视自我&#xff0c;尝试从旁观者角度认清…

Linux的基础IO:文件系统

目录 学前补充 磁盘的存储结构 OS如何对磁盘的存储进行逻辑抽象 细节内容 学前补充 问题&#xff1a;计算机只认二进制&#xff0c;即0、1&#xff0c;什么是0、1&#xff1f; 解释&#xff1a;0、1在物理层面可能有不同的表现&#xff0c;0、1是数字逻辑&#xff0c;可以…

Leetcode—2639. 查询网格图中每一列的宽度【简单】

2024每日刷题&#xff08;121&#xff09; Leetcode—2639. 查询网格图中每一列的宽度 实现代码 class Solution { public:int func(int num) {if(num 0) {return 1;}int len 0;while(num ! 0) {len;num / 10;}return len;}vector<int> findColumnWidth(vector<ve…

Vue3-element-plus表格

一、element-plus 1.用组件属性实现跳转路由 <el-menu active-text-color"#ffd04b" background-color"#232323" :default-active"$route.path" //高亮 text-color"#fff"router><el-menu-item index"/article/channe…

go的grpc的三种流模式通信

go的grpc的三种流模式通信 1、grpc通信模式简介2、stream.proto文件3、服务端代码 server.go4、客户端代码client.go5、测试说明 1、grpc通信模式简介 grpc的数据传输可以分为4种模式&#xff1a; 简单模式 (一元调用) 服务端流模式 (服务端返回实时股票数据给前台) 客户端流模…

MySQL——数据库基础

目录 一.数据库的操作 1.显示当前的数据库 2.创建数据库 3.使用数据库 4.删除数据库 一.数据库的操作 1.显示当前的数据库 SHOW DATABASES;2.创建数据库 语法&#xff1a; CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ..…

redis简介、14条常用的redis命令以及执行结果

Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的内存数据结构存储系统&#xff0c;也可以被视为一个高级的键值存储系统。 与传统的关系型数据库相比&#xff0c;Redis是基于内存的&#xff0c;这使得它具有非常高的读写性能。Redis支持多种数据结构&…