算法学习 | day36/60 背包问题/分割等和子集

一、题目打卡

        1.1 二维背包问题

        题目链接:46. 携带研究材料(第六期模拟笔试)

#include<iostream>
#include<vector>
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];}// 一开始就初始化为0,第一列就不用考虑了vector<vector<int>> dp(n,vector<int>(bagweight + 1,0));// 第一行的初始化要从满足重量要求的位置开始初始化for(int i = weight[0]; i <= bagweight;i++){dp[0][i] = value[0];}for(int i = 1; i < n;i++){for(int j = 1 ; j <= bagweight;j++){if(weight[i] > j){dp[i][j] = dp[i-1][j]; // 超重了就继承上方continue;}// 不选择idp[i][j] = max(dp[i][j],dp[i-1][j]); // 来自上方//选择idp[i][j] = max(dp[i][j],dp[i-1][j - weight[i]] + value[i]);}}// for(auto &i:dp){//     for(auto &j:i){//         cout << j << " ";//     }//     cout << endl;// }cout << dp[n - 1][bagweight];
}int main() {while(cin >> n >> bagweight) {solve();}return 0;
}

       

         先看了视频再做的,思路相对清楚了很多,我感觉这个题目递归的过程不是很复杂,反而不好理解的是这个状态的定义,还有就是写的过程中,这个索引用着的感觉也有点奇怪,但是我说不清楚,还是写一个案例自己分析一下比较好,然后就是注意一下,本身在递推的过程中,我忽略的一个情况,就是当前的物品重量肯定放不进的情况,还有就是dp[i-1][j-weight],这个地方的j,我写成的bagWeight,这样就没有递推的过程了。

        然后是滚动数组的写法,这样确实和二维数组有很多不一样的地方:

// 滚动数组
void solve_with_scrolling_array(){// 这里 dp 数组的定义就改变了,这里的dp[i]代表的是背包容量为i的时候,用所有的资源能装下的最大的价值vector<int> dp(bagweight+1,0), weight(n,0), value(n,0);for(int i = 0; i < n;i++){cin >> weight[i];}for(int i = 0; i < n;i++){cin >> value[i];}// for(int i = weight[0];i<bagweight;i++){//     dp[i] = value[0];// }for(int i = 0 ; i < n;i++){ // 这里的循环代表的是选择的种类索引for(int j = bagweight; j >= weight[i];j--){// if(weight[i] > j) continue;dp[j] = max(dp[j],dp[j-weight[i]] + value[i]); //dp[j]其实就表示的是这个值不发生变化,也就是不选择}}cout << dp[bagweight];
}

        首先是这个不能用第一个物品进行初始化,因为这样就是默认第一个物品加进去了,这样用后面倒序的方法的时候,会计算重复,之所以要用倒序,是因为一维数组无法存储左上和上的数据,这样使用当前层,就会导致当前的物品被计算了多次,所以要从后向前进行计算。特别的是这个终止的条件,其实就是之前二维数组 if 中需要继承上一个数值的一个处理。

        1.2 分割等和子集

        题目链接:. - 力扣(LeetCode)

class Solution {
public:bool canPartition(vector<int>& nums) {int sum = 0;for(auto& it: nums){sum += it;}if(sum % 2 != 0) return false; // 这种不可能分割成int n = nums.size(), bagweight = sum/2;vector<int> dp(bagweight + 1,0);for(int i = 0; i < n;i++){ // 相当于遍历每个物品for(int j = bagweight; j >= nums[i];j--){dp[j] = max(dp[j],dp[j - nums[i]] + nums[i]);}}if(dp[bagweight] == sum/2) return true;return false;// sort(nums.begin(),nums.end());// int tmp = 0;// int i = 0;// for(; i < nums.size();i++){//     tmp += nums[i];//     if(tmp == sum/2) break;// }// ++i;// int tmp1 = 0;// for(;i<nums.size();i++){//     tmp1 += nums[i];// }// return tmp1 == tmp;}
};

        做的磕磕绊绊的,主要是这个题的价值和重量是同一个东西,让我一时没反映过来。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI的力量感受(附网址)

输入 科技感的 二维码&#xff0c;生成如下&#xff0c;还是可以的 输入金属感 的芯片&#xff0c;效果就很好了 金属感 打印机&#xff0c;细节丰富&#xff0c;丁达尔效应 就有点跑题了 金属感 扫码仪 还有点像 3D 封装长这样&#xff0c;跑题比较严重 总之&#xff0c;AI还…

基于单片机分舱式电开水炉位控制系统

**单片机设计介绍&#xff0c;基于单片机分舱式电开水炉位控制系统 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机分舱式电开水炉位控制系统概要主要涉及通过单片机对电开水炉的各个舱位进行精确控制&#xff0c;实现水位、温度…

ids工业相机与电控位移台同步控制及数据采集

通过VS2017和OpenCV&#xff0c;实现ids工业相机与电控位移台同步控制及数据采集 目录项目环境配置代码流程及思路项目架构项目开发运行效果开发关键ids相机配置位移台环境配置相机头文件相机参数设置保存图像函数设置电控位移台头文件电控位移台设置参数最后就是通过main函数进…

2024.4.1-day06-认识 CSS(三大特性、引入方式)

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; day06-认识 CSS(三大特性、引入方式) 文章目录 day06-认识 CSS(三大特性、引入方式)作业…

【频繁模式挖掘】FP-Tree算法(附Python实现)

一、实验内容简介 该实验主要使用频繁模式和关联规则进行数据挖掘&#xff0c;在已经使用过Apriori算法挖掘频繁模式后&#xff0c;这次使用FP-tree算法来编写和设计程序&#xff0c;依然使用不同规模的数据集来检验效果&#xff0c;最后分析和探讨实验结果&#xff0c;看其是…

非线性方程组求解与优化的关系 Nonlinear Optimization

解非线性方程&#xff08;Nonlinear Equations&#xff09;的技术在其动机、分析和算法实现方面与优化技术&#xff08;Optimization&#xff09;有重叠。 相似点&#xff1a; 在优化和非线性方程中&#xff0c;牛顿法是许多重要算法的核心。诸如线搜索、信赖域和每次迭代中线…

nacos分布式程序开发实例

1.通过windows docker desktop 完成 nacos 的安装/启动/配置 &#xff08;1&#xff09;先安装docker desktop docker-toolbox-windows-docker-for-windows-stable安装包下载_开源镜像站-阿里云 &#xff08;2&#xff09;配置docker 国内镜像源 Docker 镜像加速 | 菜鸟教程…

未来的技术发展趋势

文章目录 前言一、人工智能技术势必聚焦安全能力二、单云环境逐渐让位于多云环境三、后量子密码或将在美大范围普及总结前言 2023 年,与网络空间安全息息相关的人工智能等技术发展迅猛,新的信息安全时代已然拉开大幕。在目睹了 ChatGPT、“星链”和量子通信等技术展现出的巨…

[开源] 基于GRU的时间序列预测模型python代码

基于GRU的时间序列预测模型python代码分享给大家&#xff0c;记得点赞哦 #!/usr/bin/env python # coding: utf-8import time time_start time.time() import numpy as np import matplotlib.pyplot as plt import pandas as pd import math from keras.models import Sequent…

Android Studio中查看和修改project的编译jdk版本

android studio中查看和修改project的编译jdk版本操作如下&#xff1a; File->settings->Build,Execution,deployment->Build Tools->Gradles 进入Gradles页面可以查看并修改project的编译jdk版本&#xff0c;如图所示

基于Leaflet.js的Marker闪烁特效的实现-模拟预警

目录 前言 一、闪烁组件 1、关于leaflet-icon-pulse 2、 使用leaflet-icon-pulse 3、方法及参数简介 二、闪烁实例开发 1、创建网页 2、Marker闪烁设置 3、实际效果 三、总结 前言 在一些地质灾害或者应急情况当中&#xff0c;或者热门预测当中。我们需要基于时空位置来…

在数字化转型的背景下,如何构建高效的数据资产管理体系?

在数字化转型的大潮中&#xff0c;数据已成为企业创新发展的重要驱动力。如何高效地管理这些数据资产&#xff0c;不仅关系到企业的日常运营&#xff0c;更直接决定了企业能否在激烈的市场竞争中脱颖而出。对于企业管理者或首席信息官&#xff08;CIO&#xff09;而言&#xff…