基本是其他大佬的思路 但cmp方法 按自己的想法推测。 感谢大佬提供的01背包思路。

#include<algorithm>
#include<cmath>
using namespace std;
struct point{
int mp,pm,rt;
}a[52];
long long dp[100005];
struct cmp{
      bool operator()(const point&a,const point&b) const{//两条方式均可
          return a.rt*1.0/a.pm < b.rt*1.0/b.pm;
//           return a.pm*1.0/a.rt >b.pm*1.0/b.rt;
      }  
};
int n,t;
int main(){
    cin >> n>>t;
    for(int i =0;i<n;i++) cin>>a[i].mp;
    for(int i =0;i<n;i++) cin>>a[i].pm;
    for(int i =0;i<n;i++) cin>>a[i].rt;
    sort(a,a+n,cmp());
    long long  ans = 0;
    for(int i = 0;i<n;i++){
        for(int j= t;j>=a[i].rt;j--){
            dp[j]=max(dp[j],dp[j-a[i].rt]+a[i].mp-a[i].pm*j);//
            ans=max(ans,dp[j]);
        }
    }
    cout<< ans;
    return 0;
}

//https://blog.csdn.net/qq_18343569/article/details/52061220

22~27行代码是01背包的空间优化,可以参考链接中查看。