ZOJ3689 Digging(01背包)

#include <iostream>
#include <cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
int dp[2][10001];
struct point{
    int t,s;
}ps[3001];
bool cmp(point A, point B)
{
    return A.t*B.s < B.t*A.s;//比较大小的时候千万不要  计算出数值进行比较
}
int main(){
    int n,t;
    int i,j;
    while(cin>>n>>t){
        for(i=0;i<n;i++)
        {
            cin>>ps[i].t>>ps[i].s;
        }
        sort(ps,ps+n,cmp);
        memset(dp,0,sizeof(dp));
        int ma=-1;
        for(i=1;i<=n;i++){
            for(j=ps[i-1].t;j<=t;j++){                
                dp[i%2][j]=max(dp[(i-1)%2][j],dp[(i-1)%2][j-ps[i-1].t]+ps[i-1].s*(t-(j-ps[i-1].t)));
                if(i==n) ma=max(ma,dp[i%2][j]); 
            }
        }
        /* for(int i = 0; i < n; i++)
            for(int j = t; j >= ps[i].t; j--){
                int index=0;
                dp[index][j] = max(dp[index][j], dp[index][j-ps[i].t]+(t-j+ps[i].t)*ps[i].s);
                if(i==n-1) ma=max(ma,dp[index][j]); 
            }*/
        cout<<ma<<endl;
    }
    return 0;
}

 

posted @ 2014-10-12 15:50  keyboard3  阅读(147)  评论(0编辑  收藏  举报