Cow Exhibition

poj2184:http://poj.org/problem?id=2184

题意:给你n头牛,每头牛有一个S值和一个F值,现在的问题是,要你选出其中的一些牛求出S+T的最大值。但是要保证总的s>=0和F>=0
题解:可以把s作为体积,然后利用0,1背包。求出每个s做对应的最大的F值,然后for一遍,求出最大的f+s。因为有负的值出现,所以把 背包的容量加上一个100000;因为过程中s的值可以是小于0的,for的时候从100000开始即可,不是很好理解。

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<string.h>
 4 #include<algorithm>
 5 using namespace std;
 6 const int INF=0x3f3f3f3f;
 7 const int MAXN=110;
 8 int dp[200010];
 9 int value[MAXN];
10 int weight[MAXN];
11 int nKind;
12 int main()
13 {
14     int k=100000;
15     while(scanf("%d",&nKind)!=EOF){
16         for(int i=0;i<nKind;i++){
17             scanf("%d%d",&value[i],&weight[i]);
18         }
19         for(int i=0;i<=200000;i++)dp[i]=-INF;
20         dp[k]=0;
21         for(int i=0;i<nKind;i++){
22             if(value[i]>0)//正的是逆序
23         {
24                 for(int j=200000;j>=value[i];j--)//注意范围
25                   if(dp[j-value[i]]>-INF)
26                     dp[j]=max(dp[j],dp[j-value[i]]+weight[i]);
27             }
28             else//负的是顺序
29             {
30                 for(int j=0;j<=200000+value[i];j++)//注意范围
31                   if(dp[j-value[i]]>-INF)
32                     dp[j]=max(dp[j],dp[j-value[i]]+weight[i]);
33             }
34         }
35         int ans=0;
36         for(int i=100000;i<=200000;i++)
37             if(dp[i]>=0&&dp[i]+i-100000>ans)
38                 ans=dp[i]+i-100000;
39         printf("%d
",ans);
40     }
41     return 0;
42 }
View Code
原文地址:https://www.cnblogs.com/chujian123/p/3402093.html