poj2184Cow Exhibition(01背包)

来源:互联网 发布:许哲 知乎 编辑:程序博客网 时间:2024/05/16 05:06

一看就是dp题,对于每头牛,只有取和不取两种情况,01背包。

设f [ i ] 表示当智商之和为 i 时情商之和最多是多少。

但智商之和有可能为负数,那么就加上一个常数。

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define maxn 100005struct node{int iq,eq;}edge[150];int n;int f[maxn<<1+5];int main(){while(scanf("%d",&n)!=EOF){for(int i=1;i<=n;i++){scanf("%d %d",&edge[i].iq,&edge[i].eq);}for(int i=0;i<=(maxn<<1);i++){f[i]=-maxn<<2;}f[maxn]=0;for(int i=1;i<=n;i++){if(edge[i].iq>=0)//注意体积的枚举顺序不同{for(int j=(maxn<<1)-1;j>=edge[i].iq;j--){if(f[j-edge[i].iq]>-maxn<<2){f[j]=max(f[j],f[j-edge[i].iq]+edge[i].eq);}}}else{for(int j=edge[i].iq;j-edge[i].iq<(maxn<<1);j++){if(f[j-edge[i].iq]>-maxn<<2){f[j]=max(f[j],f[j-edge[i].iq]+edge[i].eq);}}}}int ans=0;for(int i=maxn;i<(maxn<<1);i++){if(f[i]>=0){ans=max(ans,f[i]+i-maxn);}}printf("%d\n",ans);}}


0 0
原创粉丝点击