poj 2184 Cow Exhibition

// 给定n头牛,每头有属性智商和幽默感,这两个属性值有正有负,现在要从这n头牛中选出若干头使得他们的智商和与幽默感和不为负数,
// 并且两者两家和最大,如果无解输出0,n<=100,-1000<val<1000.
// 这题是好题 思路来自以下博客
// http://blog.csdn.net/woshi250hua/article/details/7633450

// 我开始想的是 dp[i][j][k] 放置i头牛 智商为j 幽默感为 k 是否存在 然后发现空间不允许呀、、
// 别人思路 : 将智商作为容量 幽默感作为 价值 瞬间醒悟、原来可以这样的、、然后就是普通背包了
// 1A
#include <iostream> #include <algorithm> #include <queue> #include <math.h> #include <stdio.h> #include <string.h> using namespace std; #define MOD 1000000007 #define maxn 200010 int dp[maxn]; int S[110],F[110]; int main() { int N; while(scanf("%d",&N)!=EOF){ int i,j,k; int len=0,le=0; for(i=1;i<=N;i++) { scanf("%d %d",&S[i],&F[i]); if(S[i]>=0) len+=S[i]; else le+=(-S[i]); } len=max(len,le); for(i=1;i<=2*len;i++) dp[i]=-MOD; dp[0]=0; // memset(dp,0,sizeof(dp)); for(i=1;i<=N;i++) if(S[i]>=0){ // 根据这个判断转移方向
for(j=len;j>=S[i]-len;j--){ k=j-S[i]; if(k<0) k=-k+len; if(j<0) j=-j+len; dp[j]=max(dp[j],dp[k]+F[i]); if(j>len) j=len-j; } }else{ for(j=-len;j<=len+S[i];j++){ k=j-S[i]; if(k<0) k=-k+len; if(j<0) j=-j+len; dp[j]=max(dp[j],dp[k]+F[i]); if(j>len) j=len-j; } } int ans=0; for(i=0;i<=len;i++) if(dp[i]>=0) ans=max(ans,i+dp[i]);//,printf("%d %d?",i,dp[i]); printf("%d ",ans); } return 0; }
原文地址:https://www.cnblogs.com/372465774y/p/3191250.html