博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[POJ2184] Cow Exhibition
阅读量:5138 次
发布时间:2019-06-13

本文共 1235 字,大约阅读时间需要 4 分钟。

 

题意:有n头牛,每头牛两个元素(s,t),选择若干头牛使∑s+∑t最大,且∑s、∑t非负

 

题解:

dp(带决策条件的状态)

状态:dp[j]表示s和为j时,t和的最大值

转移:dp[j+s[i]]=max{dp[j]+t[i]} (j>=0)

这样是不行的,因为s[i]会被重复转移,所以要把当前被转移的答案存到另一个数组里

tmp[j+s[i]]=max{dp[j]+t[i]}

 

#include
#include
#include
#include
#include
#include
#define ll long longusing namespace std;int dp[100010],tmp[100010];struct Node { int s,t; bool operator < (Node x) const { return s>x.s; }}p[110];int gi() { int x=0,o=1; char ch=getchar(); while(ch!='-' && (ch<'0' || ch>'9')) ch=getchar(); if(ch=='-') o=-1,ch=getchar(); while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar(); return o*x;}int main() { int n=gi(),S=n*1000,ans=0,inf; for(int i=1; i<=n; i++) { p[i].s=gi(),p[i].t=gi(); } sort(p+1,p+n+1); memset(dp,-63,sizeof(dp)); inf=dp[0],dp[0]=0; for(int i=1; i<=n; i++) { for(int j=0; j<=S; j++) tmp[j]=dp[j]; for(int j=S; j>=0; j--) { if(dp[j]==inf) continue; if(j+p[i].s>=0) { tmp[j+p[i].s]=max(dp[j+p[i].s],dp[j]+p[i].t); } } for(int j=0; j<=S; j++) dp[j]=tmp[j]; } for(int i=0; i<=S; i++) { if(dp[i]<0) continue; ans=max(ans,dp[i]+i); } printf("%d", ans); return 0;}

 

转载于:https://www.cnblogs.com/HLXZZ/p/7510520.html

你可能感兴趣的文章
如果没有按照正常的先装iis后装.net的顺序,可以使用此命令重新注册一下:
查看>>
【题解】青蛙的约会
查看>>
autopep8
查看>>
Android 官方新手指导教程
查看>>
幸运转盘v1.0 【附视频】我的Android原创处女作,请支持!
查看>>
安装 Express
查看>>
存储(硬件方面的一些基本术语)
查看>>
Weka中数据挖掘与机器学习系列之基本概念(三)
查看>>
leetcode-Sort List
查看>>
中文词频统计
查看>>
Java泛型的基本使用
查看>>
bzoj2038 [2009国家集训队]小Z的袜子(hose)
查看>>
Postman-----如何导入和导出
查看>>
【Linux】ping命令详解
查看>>
ASP.NET MVC 拓展ViewResult实现word文档下载
查看>>
8、RDD持久化
查看>>
第二次团队冲刺--2
查看>>
[转载]加密算法库Crypto——nodejs中间件系列
查看>>
使用Xshell密钥认证机制远程登录Linux
查看>>
【模板】最小生成树
查看>>