POJ 2184 Cow Exhibition(变形01背包)_ramay7的博客-程序员秘密

技术标签: 背包dp  POJ  poj  01背包  

题目链接:
POJ 2184 Cow Exhibition
题意:
给n头牛,每头牛有两个属性:smart和fun,选出若干头牛使得这些牛的smart和fun之和最大,并且smart和与fun和均不为负。
每头牛的smart和fun可以为负。
分析:
01背包和滚动数组。
用dp[j]表示得到smart和为j时的fun和最大值。但是因为j可能为负,一开始我是用map,但是一直TLE。。。
后来改成二维表示:dp[j][0]:smart和为j(j>0)时的最大fun和,dp[j][1]:smart和为-j(j<0)时的最大fun和
初始化:
dp为最小,但是dp[0][0]=dp[0][1]=0;
状态转移方程需要注意要根据smart[i]的正负确定遍历的顺序,而且还要考虑j-smart[i]的正负。
最后再遍历扫一下dp[j][0]取最大就好了。

//600K 47MS
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
using namespace std;
const int MAX_N=110;
const int MAX_M=110000;
const int inf=INT_MIN/3;

int n;
int smart[MAX_N],fun[MAX_N],dp[MAX_M][2];

int main()
{
    //freopen("Lin.txt","r",stdin);
    //freopen("Lout.txt","w",stdout);
    while(~scanf("%d",&n)){
        int max_sum=0,min_sum=0;
        for(int i=1;i<=n;i++){
            scanf("%d%d",&smart[i],&fun[i]);
            if(smart[i]>0) max_sum+=smart[i];
            else min_sum+=smart[i];
        }
        for(int j=1;j<=max(abs(min_sum),abs(max_sum))+1100;j++){
            dp[j][0]=dp[j][1]=inf;
        }
        dp[0][0]=dp[0][1]=0;
        for(int i=1;i<=n;i++){
            if(smart[i]>=0){
                for(int j=max_sum;j>=0;j--){
                    if(j-smart[i]<=0&&dp[-(j-smart[i])][1]!=inf) dp[j][0]=max(dp[-(j-smart[i])][1]+fun[i],dp[j][0]);
                    else if(j-smart[i]>=0&&dp[j-smart[i]][0]!=inf) dp[j][0]=max(dp[j-smart[i]][0]+fun[i],dp[j][0]);
                    //printf("i=%d j=%d dp[abs(j)][0]=%d\n",i,j,dp[abs(j)][0]);
                }
                for(int j=0;j>=min_sum;j--){
                    if(j-smart[i]<=0&&dp[-(j-smart[i])][1]!=inf) dp[-j][1]=max(dp[-(j-smart[i])][1]+fun[i],dp[-j][1]);
                    else if(j-smart[i]>=0&&dp[j-smart[i]][0]!=inf) dp[-j][1]=max(dp[j-smart[i]][0]+fun[i],dp[-j][1]);
                    //printf("i=%d j=%d dp[abs(j)][1]=%d\n",i,j,dp[abs(j)][1]);
                }
            }else {
                for(int j=min_sum;j<=0;j++){
                    if(j-smart[i]<=0&&dp[-(j-smart[i])][1]!=inf) dp[-j][1]=max(dp[-(j-smart[i])][1]+fun[i],dp[-j][1]);
                    else if(j-smart[i]>=0&&dp[j-smart[i]][0]!=inf) dp[-j][1]=max(dp[j-smart[i]][0]+fun[i],dp[-j][1]);
                    //printf("i=%d j=%d dp[abs(j)][1]=%d\n",i,j,dp[abs(j)][1]);
                }
                for(int j=0;j<=max_sum;j++){
                    if(j-smart[i]<=0&&dp[-(j-smart[i])][1]!=inf) dp[j][0]=max(dp[-(j-smart[i])][1]+fun[i],dp[j][0]);
                    else if(j-smart[i]>=0&&dp[j-smart[i]][0]!=inf) dp[j][0]=max(dp[j-smart[i]][0]+fun[i],dp[j][0]);
                    //printf("i=%d j=%d dp[abs(j)][0]=%d\n",i,j,dp[abs(j)][0]);
                }
            }
        }
        int ans=0;
        for(int i=max_sum;i>=0;i--){
            if(dp[i][0]>=0){
                ans=max(ans,i+dp[i][0]);
                //printf("i=%d dp[i][0]=%d\n",i,dp[i][0]);
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Ramay7/article/details/51143356

智能推荐

VC:音频函数及MCI实例_weixin_33994429的博客-程序员秘密

1、MessageBeep(UINT uType);2、sndPlaySound(LPCSTR lpszSound , UINT fuSound);3、playSound(LPCSTR pszSound,HMODULE hmod,DWORD fdwSound);4、MCI介绍:MCIERROR mciSendCommand(       MCIDEVICEID IDDevice...

React 页面间传值的个人总结_weixin_30619101的博客-程序员秘密

react 组件之间传值的方案有很多,下面是我个人经验的总结github 地址props 来传递值传值方式:通过props 获取值通过props 提供的func去修改值优点:不需要任何第三方的组件,纯react,非常纯哦缺点:代码调试有些麻烦,但是可以react 插件辅助查看到当前react 对象的props注意事项:一般在表单页面中用到组件时候会用到props ...

BZOJ 1008: [HNOI2008]越狱_faojie的博客-程序员秘密

BZOJ 1008: [HNOI2008]越狱题目Time Limit: 1 Sec Memory Limit: 162 MBDescription  监狱有连续编号为1…N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种。如果 相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱Input  输入两个整数M,N.1<=M<=10^8,1<=N<=10^12

SQL学习(3)——MySQL数据库常用的函数--流程控制函数和日期时间函数_芳机灵的三某人的博客-程序员秘密

二、流程控制函数 CASE: CASE value WHEN [value1] THEN result1 WHEN [value2] THEN result2 [ELSE result3] END (CASE语句在使用中十分灵活,这里只给出大致的语句方法) 若匹配value1,结果返回result1,若匹配value2结果返回result2,否则返回result3。 (作者在学习sql

linux服务器网卡重启后会还原,详解CentOS重启后resolv.conf被重置的解决方案_KellyWeaver的博客-程序员秘密

近期在修改一台CentOS服务器的dns时发现只要重启服务器DNS就会被强制还原,解决方案如下:1、首先在网卡设置中修改NM_CONTROLLED的值:修改文件/etc/sysconfig/network-scripts/ifcfg-eth0的内容:NM_CONTROLLED="no" //是否允许Network Manager管理,设置为no默认允许Network Manager管理DNS,所以...

使用SDNN (space displacement neural network)进行多字体手写识别_ailian0591的博客-程序员秘密

手写单字体的识别,在看过卷积神经网络的mnist例子之后,很容易实现,那么如何实现多字体的同时识别呢? 如下图LeCun大神所用的是SDNNspace displacement neural network,这是什么鬼?经过一番查询之后,原来它就是滑动窗口+图像金子塔+NMS,2015年yahoo的一篇论文 Multi-view Face Detection using d...

随便推点

大型网站系统架构设计主要要素:聊聊架构一_diaozan7206的博客-程序员秘密

原标题是&lt;不懂可以问,但是不要装逼&gt;一:看系统架构,后来觉得不妥,还是改改吧。所有内容不涉及系统架构,只涉及设计架构中注意的要素,方向有了,架构自然就出来了。细节、代码后续再贴出来,感谢大牛X-Ts提供后续代码指导,此部分内容同样借鉴之前的老师的指导。从层次看网站系统架构:一、前端架构1.浏览器优化技术:通过优化响应页面,为浏览器页面的加载和现实提速,...

DNS攻击原理与防范_dns攻击的原理和防范方式_工藤小帅的博客-程序员秘密

随着网络的逐步普及,网络安全已成为INTERNET路上事实上的焦点,它关系着INTERNET的进一步发展和普及,甚至关系着INTERNET的生存。可喜的是我们那些互联网专家们并没有令广大INTERNET用户失望,网络安全技术也不断出现,使广大网民和企业有了更多的放心,下面就网络安全中的主要技术作一简介,希望能为网民和企业在网络安全方面提供一个网络安全方案参考。  DNS的工作原理  DNS

SpringMVC请求参数的绑定与@RequestParam注解的使用_requestparam参数注解_pan_junbiao的博客-程序员秘密

当用户在页面触发某种请求时,一般会将一些参数(key/value)带到后台。在SpringMVC中可以通过参数绑定,将客户端请求的key/value数据绑定到Controller处理器方法的形参上。SpringMVC中有一些默认支持的类型,这些类型可以直接在Controller类的方法中定义,在参数绑定的过程中遇到该种类型就直接进行绑定。其默认支持的类型有以下几种:HttpServletReq...

基于Redis发布订阅的分布式WebSocket通信_redis websocket 对比_阿河的编程之路的博客-程序员秘密

1024写篇文章庆祝一下本文介绍最近公司需求需要使用到服务端的主动推送功能,在学习和研究下整理出这篇文章用于学习和记录,本文只讲技术的基本应用,没有原理介绍。采用技术:springboot、websocket、redis发布订阅需求实现服务端多节点的情况下,主动推送消息到客户端WebSokcetWebSocket介绍:WeSocket是一种协议,与Http是一个等级的,并且也是基于TCP协议,可以理解为WebSoket是Http的优化​ 常规的场景下,一般都是由客户端使用HTTP发送一.

SpringMVC的Controller层注解_永不做码农的博客-程序员秘密

@Controller 用于标记在一个类上,表示一个SpringMVC Controller对象。通过Spring使用扫描机制查找应用程序中所有基于注解的控制器类。分发处理器会扫描使用了Controller注解的类的方法是否使用了RequestMapping注解,只有使用了RequestMapping注解的方法才是真正处理请求的处理器。@Controllerpublic class ...

离群点(孤立点、异常值)检测方法_判断离群点_runrun117的博客-程序员秘密

本文介绍了离群点(孤立点)检测的常见方法,以及应用各种算法时需要注意的问题。离群点是什么?异常对象被称作离群点。异常检测也称偏差检测和例外挖掘。孤立点是一个明显偏离与其他数据点的对象,它就像是由一个完全不同的机制生成的数据点一样。离群点检测是数据挖掘中重要的一部分,它的任务是发现与大部分其他对象显著不同的对象。大部分数据挖掘方法都将这种差异信息视为噪声而丢弃,然而在一些应用中,罕见的数据...

推荐文章

热门文章

相关标签