poj2184解题报告
来源:互联网 发布:淘宝评价内容可以改吗 编辑:程序博客网 时间:2024/05/19 15:20
来源:http://poj.org/problem?id=2184
题意:有一些奶牛,他们有一定的s值和f值,这些值有正有负,最后让保证s的和为非负且f的和为非负的情况下,s+f的最大值。
解题思路:有两种价值,最开始我以为是二维背包,不过后来看到1e5的范围,二维数组肯定开不了,所以转换为0,1背包,两种状态的上界都不定,估计个最大值,全搜出来,然后在比较。
注意点:1.开一维数组的话,当s大于0时,循环逆序,当s小于0时,循环正序
2.因为状态(数组的维度)可负,所以用1e6这个状态来表示0;低于它为负数,高于它为正数
所以初始化需要dp[1000000]=0;
上下界要估计好
#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>using namespace std;const int maxn=2*1e6+10;const int INF=-(1<<30);int dp[maxn];int main(){ int n; while(scanf("%d",&n)!=EOF) { for(int i=0;i<=200000;i++) dp[i]=INF; dp[100000]=0; int a,b; for(int i=1; i<=n; i++) { scanf("%d%d",&a,&b); if(a<0&&b<0) continue;//直接不用它 if(a>0) for(int j=200000; j-a>=0; j--) { if(dp[j-a]>INF) dp[j]=max(dp[j-a]+b,dp[j]); } else { for(int j=a; j<=200000+a; j++)//取好上界 { if(dp[j-a]>INF) dp[j]=max(dp[j-a]+b,dp[j]); } } } int ans=INF; for(int j=100000; j<=200000; j++) { if(dp[j]>=0) ans=max(ans,dp[j]+j-100000); } printf("%d\n",ans); } return 0;}
0 0
- poj2184解题报告
- POJ2184
- poj2184
- poj2184
- poj2184
- poj2184
- 解题报告
- 解题报告
- 解题报告
- 解题报告
- 解题报告
- 解题报告
- 解题报告
- Antiprime解题报告
- expr解题报告
- 华容道解题报告
- tju解题报告
- zju1062/pku1095解题报告
- 模板方法模式(Template Method)
- 推荐一个IOS和安卓的源码网站
- JS获取屏幕宽度的说明
- mysql中Where条件中字段顺序的重要性
- 黑马程序员-【java基础】-多线程
- poj2184解题报告
- 圖片視頻上傳下載
- 英语总结——六月
- 通过时间,获得星期的开始时间,结束时间
- Android设计模式之浅谈MVP
- Android实现推送方式解决方案
- LNMP笔记:Centos下安装Postfix,替换sendmail发送邮件
- 点点滴滴
- 在安卓开发中如何在代码中设置ImageView中src中这个参数