P2340 奶牛会展 DP

\(n\)头牛,每头牛有智商\(s[i]\)情商\(f[i]\),问如何从中选择几头牛使得智商情商之和最大 且 情商之和、智商之和非负

\(n\le 400,-10^3\le s[i] \le 10^3\)

看似两维难以处理,我们可以先考虑一维,做体积为智商、价值为情商的01背包,最后遍历体积不为负的状态更新答案即可。

需要注意的是,体积可能为负,所以我们整体加\(400\times1000\);负数体积遍历背包时,因为已经压缩了一维,原本要倒序遍历体积,但是这里是负数,所以要正序遍历(否则会覆盖之前的状态)

另外这里的背包体积是恰好填满,所以初值要全部设为-INF,而不是\(0\)

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
inline int read(){
char ch=getchar();int s=0;
bool isf=0;
while((ch<'0'||ch>'9')&&(ch!='-')) ch=getchar();
if(ch=='-'){ch=getchar();isf=1;}
while(ch>='0'&&ch<='9') s=s*10+(ch^'0'), ch=getchar();
if(isf) return -s;
return s;
}
#define MAXN 404
#define BASE 400*1000
int n;
int s[MAXN],f[MAXN];
int dp[800008];
int main(){
n=read();
int mxs=0;
for(int i=1;i<=n;++i) s[i]=read(),f[i]=read(),mxs+=s[i];
memset(dp, -0x3f, sizeof dp);
dp[BASE]=0;
for(int i=1;i<=n;++i){
if(s[i]>=0)
for(int j=BASE+mxs;j>=s[i];--j)
dp[j]=max(dp[j], dp[j-s[i]]+f[i]);
else
for(int j=s[i];j<=BASE+mxs;++j)
dp[j]=max(dp[j], dp[j-s[i]]+f[i]);
}
int ans=0;
for(int i=BASE;i<=mxs+BASE;++i)
if(dp[i]>=0)
ans=max(ans, i-BASE+dp[i]);
printf("%d\n", ans);
return 0;
}

最新文章

  1. htm常用标签总结
  2. dwz中权限的控制
  3. 拟物设计和Angular的实现 - Material Design(持续更新)
  4. 关于EditText的OnClickListener失效的解决办法
  5. libsqlite3.dylib找不到
  6. hust 1010 最短循环节点
  7. 使用StarUML创建类图
  8. oracle 配置服务端
  9. jquery promot
  10. uestc 10 In Galgame We Trust
  11. file.go
  12. 使用 线性规划 解决 数字 排序问题, +Leapms模型
  13. Windows Server 2008 R2 /2012 修改密码策略
  14. 漫谈PHP组件、框架、Composer那些事
  15. chrome 调试功能使用说明
  16. Opentsdb 启动显示配置文件不存在
  17. Linux 入门记录:十二、Linux 权限机制【转】
  18. java快速排序引起的StackOverflowError异常
  19. iscsi target tgt架构
  20. c# 协变与抗变

热门文章

  1. golang --- time包常用函数以及基础的类型转换
  2. Java爬虫https网页内容报错SSLHandshakeException信任(忽略)所有SSL证书
  3. ASP.NET SignalR 系列(四)之指定对象推送
  4. Java自学-类和对象 继承
  5. 【Java基础】- Java学习路线图
  6. JS基础理论相关知识
  7. tf常见的损失函数(LOSS)汇总
  8. synchronized关键字的使用
  9. Leetcode刷题python
  10. Linux应用与端口