#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; }
时间: 2024-10-25 03:20:42