http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/3903.html
官方说这是一个很难的DP
然后我随便想了一下
切了
哈哈哈
虽然我ACM水平不强吧
但感觉在山东还是能混上一两下的
这题的精髓在于你的DP顺序
也就是你的排序
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e4;
struct P{
int a,c,d;
}A[N];
bool cmp(P x,P y){
return x.d*x.c+y.d*(x.c+y.c)<y.d*y.c+x.d*(x.c+y.c);
}
int DP[N][N];
int main(){
int n,T;
cin>>n>>T;
for(int i=1;i<=n;++i){
cin>>A[i].a;
}
for(int i=1;i<=n;++i){
cin>>A[i].d;
}
for(int i=1;i<=n;++i){
cin>>A[i].c;
}
sort(A+1,A+1+n,cmp);
for(int i=1;i<=n;++i){
for(int j=T;j>=A[i].c;--j){
DP[i][j]=max(DP[i-1][j],DP[i-1][j-A[i].c]+max(A[i].a-A[i].d*j,0));
}
for(int j=A[i].c-1;j>=1;--j)
DP[i][j]=DP[i-1][j];
}
int ans=0;
for(int i=1;i<=T;++i){
ans=max(ans,DP[n][i]);
}
cout<<ans<<endl;
}