poj 2184 01背包应用

来源:互联网 发布:劲霸淘宝旗舰店 编辑:程序博客网 时间:2024/06/09 23:04

点击打开链接

#include <iostream>#include <algorithm>using namespace std;const int M =100000;const int inf=2*M;int s[M+10],f[M+10]; int dp[2*M+10]; // dp[i][j] 前i只牛的Smartness为 J时 最大的Funness   // dp[i][j]= max(dp[i-1][j] ,dp[i-1][j-s[i]]+f[i]) int main(){int n;cin>>n;for(int i=1;i<=n;i++){cin>>s[i]>>f[i]; }for(int j=0;j<=2*M;j++){dp[j]=-inf; //  前0只 装不满 J 时为 -inf }dp[M]=0; // dp[M]代表 S为0的最大F     0~M负数 M~2M为正 for(int i=1;i<=n;i++){if(s[i]<0&&f[i]<0) // 都为负数肯定不选 continue; if(s[i]>=0)for(int j=2*M;j>=s[i];j--){dp[j]=max(dp[j],dp[j-s[i]]+f[i]);}else{for(int j=s[i];j<=2*M+s[i];j++) //s[i]为负数时 dp[i][j]= max(dp[i-1][j+s[i]],dp[i-1][j])->正推 //j-s[i]<=2M  j<2M+s[i]{ dp[j]=max(dp[j],dp[j-s[i]]+f[i]); }}}int ans=-inf;for(int j=M;j<=2*M;j++){if(dp[j]>=0){ans=max(ans,dp[j]+j-M);}}if(ans==inf) ans=0; cout<<ans<<endl;return 0;} 


0 0