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

news2024/11/27 18:01:11

一、题目打卡

        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;
            }
            // 不选择i
            dp[i][j] = max(dp[i][j],dp[i-1][j]); // 来自上方
            //选择i
            dp[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.coloradmin.cn/o/1578068.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云手机提供私域流量变现方案

当今数字营销领域&#xff0c;私域流量是一座巨大的金矿&#xff0c;然而并非人人能够轻易挖掘。一家营销公司面临着利用社交、社区、自媒体等应用积累私域流量&#xff0c;并通过销售产品、推送广告等方式实现流量变现的挑战与困境。本文将详细介绍这家公司是如何通过云手机&a…

Flutter学习11 - Future 与 FutureBuilder

1、Future 可以利用 Future 实现异步调用 1.1、Future 的两种形式 自定义一个结果类 class Response {String _data;Response(this._data); }自定义方法实现 Future Future<Response> testFuture() {var random Random();int randomNumber random.nextInt(10);if …

IDEA页面配置:(基本配置)

IDEA页面配置&#xff1a;&#xff08;基本配置&#xff09; 文章目录 IDEA页面配置&#xff1a;&#xff08;基本配置&#xff09;前言&#xff1a;一、主要内容&#xff1a;&#x1f60d;1. 页面背景改为 白色&#xff08;设置主题&#xff09;2. &#xff08;设置字体&#…

基于java+springboot+vue实现的教学辅助系统(文末源码+Lw)23-225

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#…

Java常用API_System——常用方法及代码演示

1.System.exit(int status) 方法的形参int status为状态码&#xff0c;如果是0&#xff0c;说明虚拟机正常停止&#xff0c;如果非0&#xff0c;说明虚拟机非正常停止。需要将程序结束时可以调用这个方法 代码演示&#xff1a; public class Test {public static void main(S…

动态输出n位小数——满满都是坑!

【题目描述】 输入正整数a&#xff0c;b&#xff0c;c&#xff0c;输出a/b的小数形式&#xff0c;精确到小数点后c位。a,b ≤10^6 &#xff0c;c≤100。输入包含多组数据&#xff0c;结束标记为a&#xff1d;b&#xff1d;c&#xff1d;0。 【样例输入】 1 6 4 0 0 0 【样…

2012年认证杯SPSSPRO杯数学建模D题(第二阶段)人机游戏中的数学模型全过程文档及程序

2012年认证杯SPSSPRO杯数学建模 D题 人机游戏中的数学模型 原题再现&#xff1a; 计算机游戏在社会和生活中享有特殊地位。游戏设计者主要考虑易学性、趣味性和界面友好性。趣味性是本质吸引力&#xff0c;使玩游戏者百玩不厌。网络游戏一般考虑如何搭建安全可靠、丰富多彩的…

[开源] 基于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…

免费分享一套微信小程序在线订餐(点餐)配送系统(SpringBoot+Vue),帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序在线订餐(点餐)配送系统(SpringBootVue)&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序在线订餐(点餐)配送系统(SpringBootVue) Java毕业设计_哔哩哔哩_bilibili【免费】微信小程序在…

两相欠压继电器 WY-35A3 额定输入电压100V 导轨安装 JOSEF约瑟

系列型号&#xff1a; WY-35A4电压继电器&#xff1b;WY-35B4电压继电器&#xff1b; WY-35C4电压继电器&#xff1b;WY-35D4电压继电器&#xff1b; WY-35A4D电压继电器&#xff1b;WY-35A4T电压继电器&#xff1b; WY-35B4D电压继电器&#xff1b;WY-35B4T电压继电器&#xf…

希亦、添可、追觅洗地机深入对比,哪个更胜一筹?选择不再迷茫

洗地机不仅能快速打扫地面&#xff0c;省时又省力&#xff0c;还能把室内弄得干干净净的&#xff0c;用起来感觉特舒服。但是面对目前市面上几百个型号的洗地机&#xff0c;在观望洗地机的家庭&#xff0c;大多数都是不确定哪款洗地机适合自己&#xff0c;今天笔者就带来了三款…

Flink内存模型

1、Flink进程内存模型 配置项 TaskManager 配置参数 JobManager 配置参数 Flink 总内存taskmanager.memory.flink.sizejobmanager.memory.flink.size进程总内存taskmanager.memory.process.sizejobmanager.memory.process.size 2、Task Managers内存模型 组成部分 配…

JSON字符串中获取一个特定字段的值

JSON字符串中获取一个特定字段的值 一、方式一&#xff0c;引用gson工具二、方式二&#xff0c;使用jackson三、方式三&#xff0c;使用jackson转换Object四、方式四&#xff0c;使用hutool&#xff0c;获取报文数组数据 一、方式一&#xff0c;引用gson工具 测试报文&#xf…

八字测算qq手机号码生辰吉凶81数理测算数据

#小李子9479# 首先&#xff0c;要有81数理的数据&#xff0c;经过多方搜集&#xff0c;终于整理成下面sql数据表。 **注意&#xff0c;以阳历&#xff0c;即农历日期为准。** 根据生日年月日时计算81数理钩子数&#xff0c; 年&#xff0c;月&#xff0c;日&#xff0c;时分…

使用 Python 批量提取 Excel 中的图片(提供工具下载链接)

本文收录于《Python入门核心技术》专栏&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 大家好&#xff0c;我是水滴~~ 本文主要讲解如何利用 Python 来批量提取 Excel 中的图片&#xff0c;分别保存到目录中。并将程序打包成可执行文件&am…

【MATLAB源码-第180期】基于matlab的PTS,SLM,CPFilter三种降低OFDM系统的PAPR仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. 限幅和滤波&#xff08;Clipping and Filtering&#xff09; 原理简介 限幅和滤波是一种基础且直观的方法&#xff0c;用于降低OFDM信号的PAPR。在限幅阶段&#xff0c;信号的幅度在达到设定阈值时会被削减&#xff0c;…

《springcloud alibaba》 四 seata安装以及使用

目录 准备调整db配置准备创建数据库 seata配置nacos配置confi.txt下载向nacos推送配置的脚本 启动seata新建项目order-seata项目 订单项目数据库脚本pom.xmlapplication.yml启动类实体类dao类service类controller类feign类mapper类 stock-seata 库存项目数据库脚本pom.xmlappli…

高效解决Ubuntu Server 18.04.1 LTS 64bit更新gdb8.1.1到gdb12.1

文章目录 问题解决步骤 问题 因为需要用到gdb一些指令&#xff0c;但是gdb8.x好像存在普遍的问题&#xff0c;实现不了某些指令&#xff0c;比方说set detach-on-fork on&#xff0c;升级版本也没有比较好的教程 经过我不断的试错&#xff0c;我终于升级成功了&#xff01;&a…

Qt使用QWidget重绘实现圆环形渐变色进度条(支持不确定进度模式)

效果如下&#xff1a; 从纯竖直方向顶部蓝色到底部青色的渐变。 从左上角偏左45到右下角偏右45的蓝色到青色渐变。 从左上角偏左22.5到右下角偏右22.5的蓝色到青色渐变。&#xff08;这个角度渐变最好看&#xff09; 可以选择添加背景图片 支持两种模式&#xff1a;正常进度模…

【完全背包求方案数问题】AcWing1023.买书(赋练习题目)

【题目链接】活动 - AcWing 输入样例1&#xff1a; 20输出样例1&#xff1a; 2输入样例2&#xff1a; 15输出样例2&#xff1a; 0输入样例3&#xff1a; 0输出样例3&#xff1a; 1 【代码】 //1023.买书——完全背包问题#include<bits/stdc.h>using namespace st…