Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 11092 | Accepted: 4404 |
Description
Input
Output
Sample Input
5 -5 7 8 -6 6 -3 2 1 -8 -5
Sample Output
8
题意:给出n个奶牛,每个奶牛有ts之和tf值,从中选出一些奶牛使ts+tf之和最大且ts之和与tf之和均大于0
思路:选与不选的问题,转化为01背包。将ts作为体积,tf作为价值。
#include"cstdio" #include"cstring" #include"algorithm" using namespace std; const int MAXN=200005; const int INF=0x3fffffff; int dp[MAXN]; int n; int ts[MAXN],tf[MAXN]; int main() { while(scanf("%d",&n)!=EOF) { for(int i=0;i<MAXN;i++) dp[i]=-INF; for(int i=0;i<n;i++) { scanf("%d%d",&ts[i],&tf[i]); } dp[100000]=0; for(int i=0;i<n;i++) { if(ts[i]<0&&tf[i]<0) continue; if(ts[i]>0) { for(int j=200000;j>=ts[i];j--)//体积大于0时倒序 dp[j]=max(dp[j],dp[j-ts[i]]+tf[i]); } else { for(int j=0;j<=200000+ts[i];j++)//体积小于0时正序 dp[j]=max(dp[j],dp[j-ts[i]]+tf[i]); } } int maxn=-INF; for(int i=100000;i<=200000;i++) { if(dp[i]>=0) maxn=max(maxn,dp[i]+i-100000); } if(maxn>0) printf("%d\n",maxn); else printf("0\n"); } return 0; }
原文:http://www.cnblogs.com/program-ccc/p/5188326.html