背包九讲——01背包(降维+常数级优化)

2024-03-06 18:58

本文主要是介绍背包九讲——01背包(降维+常数级优化),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:

    共n个物体,第i个重量为w[i],价值v[i],背包最多能背不超过W的物体,求最大的价值

分析:

    每个物体只有一个,在容量允许时(W>w[i]),则对于每个物体只有取、不取两种选择

    状态:dp[i][j]:前i个物体,在容量为j的时候,最大的价值

    状态转移:

  

 dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]);

二维核心:

for(i = 1; i<=n; i++)
{for(j = 0; j<=W; j++){if(j<w[i])dp[i][j] = dp[i-1][j];elsedp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]);}
}
二维代码:

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <string>
#include <math.h>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <vector>using namespace std;int w[100], v[100];
int dp[100][100];int main()
{freopen("a.txt", "r", stdin);int n, W, i, j;while(~scanf("%d%d", &W, &n)){memset(dp, 0, sizeof(dp));for(i = 1; i<=n; i++){scanf("%d%d", &w[i], &v[i]);}for(i = 1; i<=n; i++){for(j = 0; j<=W; j++){if(j<w[i])dp[i][j] = dp[i-1][j];elsedp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]);}}printf("%d\n", dp[n][W]);}return 0;
}

降维:

    减行,第i个物体的更新,只依赖于第i-1个的物体的结果

    所以可以用滚动数组,每次只存i和i-1时候的值 (可得:dp[n][W] → dp[2][W] )

    删行,第i个物体在容积为j状态的更新,只依赖i-1物体容量里j-w[i]的状态的结果

    所以,从后面开始向前更新,则求j位置时候,j-w[i]的值依旧为i-1时候的值(可得:dp[n][W] → dp[W] )

一维核心:

for(i = 1; i<=n; i++)
{for(j = W; j>=w[i]; j--) //从后向前,此时dp[j-w[i]]相当于dp[i-1][j-w[i]]{dp[j] = max(dp[j], dp[j-w[i]] + v[i]);}
}
一维代码:
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <string>
#include <math.h>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <vector>using namespace std;int w[100], v[100];
int dp[100];int main()
{freopen("a.txt", "r", stdin);int n, W, i, j;while(~scanf("%d%d", &W, &n)){memset(dp, 0, sizeof(dp));for(i = 1; i<=n; i++){scanf("%d%d", &w[i], &v[i]);}for(i = 1; i<=n; i++){for(j = W; j>=w[i]; j--){if(j>=v[i])   dp[j] = max(dp[j], dp[j-w[i]] + v[i]);}}printf("%d\n", dp[W]);}return 0;
}

初始化:

    1、memset(dp, 0, sizeof(dp))

        求不超过容积的W的最大价值

        容积有剩余的状态依旧有值,为前一个恰好装满最优解的值

    2、memset(dp, -0x3f, sizeof(dp)); //负无穷、不可达点(当前值约为:-1e+10)

        求恰好装满容积的最大价值(可能无解)

        当且仅当恰好装满的状态有值,其他存在空白容积的状态无法到达

常数级优化:

    一维中的内循环下限,由j>=w[i] → j>=max{w[i], W-(∑(i,n)w[i])}

    1、下限为j>=w[i]时候

        在所有剩余容积大于等于w[i]时候,选择取、不取第i物品

    2、下限为j>=max{w[i], W-(∑(i,n)w[i])}时候

        只更新在i+1时候需要用到的状态,并不把所以可能状态求出

常数级优化代码:

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <string>
#include <math.h>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <vector>using namespace std;int w[100], v[100];
int dp[100];int main()
{freopen("a.txt", "r", stdin);int n, W, i, j;while(~scanf("%d%d", &W, &n)){memset(dp, 0, sizeof(dp));for(i = 1; i<=n; i++){scanf("%d%d", &w[i], &v[i]);}int lower, sum = 0;for(i = 1; i<=n; i++){if(i!=1) sum += w[i-1];lower = max(sum, w[i]);for(j = W; j>=lower; j--){dp[j] = max(dp[j], dp[j-w[i]] + v[i]);}}printf("%d\n", dp[W]);}return 0;
}
大神总结的,博客原址http://739789987.blog.51cto.com/8328242/1438296

                  

这篇关于背包九讲——01背包(降维+常数级优化)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/781008

相关文章

Spring Boot基于 JWT 优化 Spring Security 无状态登录实战指南

《SpringBoot基于JWT优化SpringSecurity无状态登录实战指南》本文介绍如何使用JWT优化SpringSecurity实现无状态登录,提高接口安全性,并通过实际操作步骤... 目录Spring Boot 实战:基于 JWT 优化 Spring Security 无状态登录一、先搞懂:为什

Java JAR 启动内存参数配置指南(从基础设置到性能优化)

《JavaJAR启动内存参数配置指南(从基础设置到性能优化)》在启动Java可执行JAR文件时,合理配置JVM内存参数是保障应用稳定性和性能的关键,本文将系统讲解如何通过命令行参数、环境变量等方式... 目录一、核心内存参数详解1.1 堆内存配置1.2 元空间配置(MetASPace)1.3 线程栈配置1.

Docker多阶段镜像构建与缓存利用性能优化实践指南

《Docker多阶段镜像构建与缓存利用性能优化实践指南》这篇文章将从原理层面深入解析Docker多阶段构建与缓存机制,结合实际项目示例,说明如何有效利用构建缓存,组织镜像层次,最大化提升构建速度并减少... 目录一、技术背景与应用场景二、核心原理深入分析三、关键 dockerfile 解读3.1 Docke

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

Java实现复杂查询优化的7个技巧小结

《Java实现复杂查询优化的7个技巧小结》在Java项目中,复杂查询是开发者面临的“硬骨头”,本文将通过7个实战技巧,结合代码示例和性能对比,手把手教你如何让复杂查询变得优雅,大家可以根据需求进行选择... 目录一、复杂查询的痛点:为何你的代码“又臭又长”1.1冗余变量与中间状态1.2重复查询与性能陷阱1.

Python内存优化的实战技巧分享

《Python内存优化的实战技巧分享》Python作为一门解释型语言,虽然在开发效率上有着显著优势,但在执行效率方面往往被诟病,然而,通过合理的内存优化策略,我们可以让Python程序的运行速度提升3... 目录前言python内存管理机制引用计数机制垃圾回收机制内存泄漏的常见原因1. 循环引用2. 全局变

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.

MySQL中优化CPU使用的详细指南

《MySQL中优化CPU使用的详细指南》优化MySQL的CPU使用可以显著提高数据库的性能和响应时间,本文为大家整理了一些优化CPU使用的方法,大家可以根据需要进行选择... 目录一、优化查询和索引1.1 优化查询语句1.2 创建和优化索引1.3 避免全表扫描二、调整mysql配置参数2.1 调整线程数2.

深入解析Java NIO在高并发场景下的性能优化实践指南

《深入解析JavaNIO在高并发场景下的性能优化实践指南》随着互联网业务不断演进,对高并发、低延时网络服务的需求日益增长,本文将深入解析JavaNIO在高并发场景下的性能优化方法,希望对大家有所帮助... 目录简介一、技术背景与应用场景二、核心原理深入分析2.1 Selector多路复用2.2 Buffer