刷題——Cow Exhibition POJ - 2184

/*
變種01揹包,將一種價值轉化成數組下標,變成改下標下另一種物品價值的最大值
*/
#include <stdio.h>
int dp[200005];
int s[105],f[105];
#define INF 1e9
#define max(a,b) a>b?a:b
int main(){
    int n;
    while(~scanf("%d",&n)){
        for(int i=0;i<n;i++){
            scanf("%d %d",&s[i],&f[i]);
            if(s[i]<=0&&f[i]<=0){
                i--;
                n--;
            }
        }
        for(int i=1;i<=200000;i++){
            dp[i]=-INF;
        }
        dp[100000]=0;
        for(int i=0;i<n;i++){
            if(s[i]>=0){
                for(int j=200000;j>=s[i];j--){
                    if(dp[j-s[i]]>-INF){
                        dp[j]=max(dp[j],dp[j-s[i]]+f[i]);
                    }
                }
            }
            else{
                for(int j=0;j<=200000+s[i];j++){
                    if(dp[j-s[i]]>-INF){
                        dp[j]=max(dp[j],dp[j-s[i]]+f[i]);
                    }
                }
            }
        }
        int ans=-INF;
        for(int i=100000;i<=200000;i++){
            if(dp[i]>=0){
                ans=max(ans,dp[i]+i-100000);
            }
        }
        printf("%d\n",ans>-INF?ans:0);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章