题目:
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=110,M=10010;
int n;
struct Stone{
int s,e,l;
}stones[N];
bool cmp(Stone a,Stone b){
return a.s*b.l<b.s*a.l;
}
int f[N][M];
int main(){
int T;
cin>>T;
for(int C=1;C<=T;C++){
cin>>n;
int m=0;
for(int i=1;i<=n;i++){
int s,e,l;
cin>>s>>e>>l;
stones[i]={s,e,l};
m+=s;
}
//类似国王游戏,找出排序条件
sort(stones+1,stones+1+n,cmp);
for(int i=1;i<=n;i++){
for(int j=0;j<=m;j++){
f[i][j]=f[i-1][j];
if(j>=stones[i].s){
int s=stones[i].s,e=stones[i].e,l=stones[i].l;
f[i][j]=max(f[i][j],f[i-1][j-s]+max(0,e-l*(j-s)));
}
}
}
//时间不一定是越大越好,所以限制是刚好要在每一个状态中找到最大的
int res=0;
for(int i=0;i<=m;i++)res=max(res,f[n][i]);
printf("Case #%d: %d\n",C,res);
}
return 0;
}