poj2184解题报告
2015-06-27 09:26
204 查看
来源: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;
上下界要估计好
题意:有一些奶牛,他们有一定的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; }
相关文章推荐
- mysql中Where条件中字段顺序的重要性
- JS获取屏幕宽度的说明
- 黑马程序员-【java基础】-多线程
- 推荐一个IOS和安卓的源码网站
- 模板方法模式(Template Method)
- gem install bundler
- Struts2返回JSON对象总结
- SVM样本训练步骤
- 粉碎机项目相关知识点
- helloworld
- 【Hibernate】Hibernate的多表查询
- 石灰墙上的这种污渍怎么去掉?黑色灰色的
- 对那些想写个网络音乐播放器、电台玩玩的同学提供一些原料
- 认识自己——恐惧的奴隶:动物
- CSS3动画-动画
- SED命令详解
- cURL使用教程及实例演示
- 远程通信(RPC,Webservice,RMI,JMS、EJB、JNDI的区别)对比
- 远程通信(RPC,Webservice,RMI,JMS、EJB、JNDI的区别)对比
- android Unable to execute dex问题的解决