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

相关文章

Python自动化Office文档处理全攻略

《Python自动化Office文档处理全攻略》在日常办公中,处理Word、Excel和PDF等Office文档是再常见不过的任务,手动操作这些文档不仅耗时耗力,还容易出错,幸运的是,Python提供... 目录一、自动化处理Word文档1. 安装python-docx库2. 读取Word文档内容3. 修改

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

Spring Boot 整合 ShedLock 处理定时任务重复执行的问题小结

《SpringBoot整合ShedLock处理定时任务重复执行的问题小结》ShedLock是解决分布式系统中定时任务重复执行问题的Java库,通过在数据库中加锁,确保只有一个节点在指定时间执行... 目录前言什么是 ShedLock?ShedLock 的工作原理:定时任务重复执行China编程的问题使用 Shed

Redis如何使用zset处理排行榜和计数问题

《Redis如何使用zset处理排行榜和计数问题》Redis的ZSET数据结构非常适合处理排行榜和计数问题,它可以在高并发的点赞业务中高效地管理点赞的排名,并且由于ZSET的排序特性,可以轻松实现根据... 目录Redis使用zset处理排行榜和计数业务逻辑ZSET 数据结构优化高并发的点赞操作ZSET 结

深入理解Apache Airflow 调度器(最新推荐)

《深入理解ApacheAirflow调度器(最新推荐)》ApacheAirflow调度器是数据管道管理系统的关键组件,负责编排dag中任务的执行,通过理解调度器的角色和工作方式,正确配置调度器,并... 目录什么是Airflow 调度器?Airflow 调度器工作机制配置Airflow调度器调优及优化建议最

微服务架构之使用RabbitMQ进行异步处理方式

《微服务架构之使用RabbitMQ进行异步处理方式》本文介绍了RabbitMQ的基本概念、异步调用处理逻辑、RabbitMQ的基本使用方法以及在SpringBoot项目中使用RabbitMQ解决高并发... 目录一.什么是RabbitMQ?二.异步调用处理逻辑:三.RabbitMQ的基本使用1.安装2.架构

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在