POJ 2184 Cow Exhibition 0-1背包变种之处理负值 dp循环方向理解

2023-10-17 09:38

本文主要是介绍POJ 2184 Cow Exhibition 0-1背包变种之处理负值 dp循环方向理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接

Description
“Fat and docile, big and dumb, they look so stupid, they aren’t much
fun…”
-Cows with Guns by Dana Lyons
The cows want to prove to the public that they are both smart and fun. In order to do this, Bessie has organized an exhibition that will be put on by the cows. She has given each of the N (1 <= N <= 100) cows a thorough interview and determined two values for each cow: the smartness Si (-1000 <= Si <= 1000) of the cow and the funness Fi (-1000 <= Fi <= 1000) of the cow.
Bessie must choose which cows she wants to bring to her exhibition. She believes that the total smartness TS of the group is the sum of the Si’s and, likewise, the total funness TF of the group is the sum of the Fi’s. Bessie wants to maximize the sum of TS and TF, but she also wants both of these values to be non-negative (since she must also show that the cows are well-rounded; a negative TS or TF would ruin this). Help Bessie maximize the sum of TS and TF without letting either of these values become negative.
Input
Line 1: A single integer N, the number of cows
Lines 2…N+1: Two space-separated integers Si and Fi, respectively the smartness and funness for each cow.
Output
Line 1: One integer: the optimal sum of TS and TF such that both TS and TF are non-negative. If no subset of the cows has non-negative TS and non- negative TF, print 0.
Sample Input
5
-5 7
8 -6
6 -3
2 1
-8 -5
Sample Output
8
Hint
OUTPUT DETAILS:
Bessie chooses cows 1, 3, and 4, giving values of TS = -5+6+2 = 3 and TF
= 7-3+1 = 5, so 3+5 = 8. Note that adding cow 2 would improve the value
of TS+TF to 10, but the new value of TF would be negative, so it is not
allowed.

大致题意:
共有N头牛,接下来N行是每头牛的智商和情商,从这些牛中任选若干头,使得牛的智商和(TS)+情商和(TF)最大,同时智商和(TS),情商和(TF)都不小于0。

解题思路:
以智商为容量,求前i头牛在智商为j的情况下的最大情商,将问题转化为0-1背包之恰好装满一定的容积

dp[j]:=前i头牛在智商为j的情况下的最大情商
将i从1到n遍历,同时更新dp[j]
状态转移方程:dp[j]=max(dp[j], dp[j-w[i]]+v[i])
-1000 <= Si <= 1000     1=<n<=100

为了避免负数作为下标,智商和(TS)都加上100000,整体的范围就变为[0,200000]

初始化时dp[100000]=0,其余的dp[j]=-INF 这里我们用-INF表示不存在的情况(因为需要恰好装满体积 j ,所以我们可以先判断前提条件存不存在)

w[i]>0时,dp[j]的计算顺序为从大往小计算,因为在计算前i头牛的最优情商和时,dp[j-w[i]]是前i-1头牛的最优情商和,而这个值在dp[j]的左侧,所以我们从右往左计算,这样就可以利用前i-1的解,不会覆盖。
同理当w[i]<=0时,dp[j]的计算顺序为从小往大计算,因为dp[j-w[i]]这个时候在dp[ j ]的右侧了。
(想一想数组重复利用的过程便不难理解了)

AC代码:

#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;int dp[200005];
int w[101]; int v[101];
#define M 100000
#define INF 0x3fffffff
int main() {int n;cin >> n;for (int i = 1; i <= n; i++) {cin >> w[i] >> v[i];}for (int i = 0; i <= 200000; i++) { dp[i] = -INF; }dp[100000] = 0;for (int i = 1; i <= n; i++) {if (w[i] > 0) {for (int j = 200000; j >= w[i]; j--) {if (dp[j - w[i]] != -INF) {//前置条件成立dp[j] = max(dp[j], dp[j - w[i]] + v[i]);}}}else {for (int j = 0; j <= 200000+w[i]; j++) {if (dp[j - w[i]] != -INF) {//前置条件成立dp[j] = max(dp[j], dp[j - w[i]] + v[i]);}}}}int ans = 0;for (int i = 100000; i <= 200000; i++) {if (dp[i] < 0)continue;ans = max(ans, dp[i] + i - 100000);}cout << ans << endl;//system("pause");
}

解题过程中参考的大神博客:
POJ 2184 Cow Exhibition (处理负值的01背包)

这篇关于POJ 2184 Cow Exhibition 0-1背包变种之处理负值 dp循环方向理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

Python自动化处理PDF文档的操作完整指南

《Python自动化处理PDF文档的操作完整指南》在办公自动化中,PDF文档处理是一项常见需求,本文将介绍如何使用Python实现PDF文档的自动化处理,感兴趣的小伙伴可以跟随小编一起学习一下... 目录使用pymupdf读写PDF文件基本概念安装pymupdf提取文本内容提取图像添加水印使用pdfplum

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

基于Redis自动过期的流处理暂停机制

《基于Redis自动过期的流处理暂停机制》基于Redis自动过期的流处理暂停机制是一种高效、可靠且易于实现的解决方案,防止延时过大的数据影响实时处理自动恢复处理,以避免积压的数据影响实时性,下面就来详... 目录核心思路代码实现1. 初始化Redis连接和键前缀2. 接收数据时检查暂停状态3. 检测到延时过