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 }