首页 > 代码库 > ZOJ3689 Digging(01背包)

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;}

 

ZOJ3689 Digging(01背包)