dp[i][j][k]
i为搜索到第几个物品
j为用了多少时间
k=0是表示hack过的地方数量
k=105表示hack过的资源量
剩下的k从1-dp[i][j][0]表示hack过的地方
#include<bits/stdc++.h>
using namespace std;
struct port{
int t,c,d,i;
}a[111];
int n,dp[105][2005][105],ans,ai,aj;
bool cmp(port a1,port a2){
return a1.d<a2.d;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
a[i].i=i;
cin>>a[i].t>>a[i].d>>a[i].c;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
for(int j=a[i].t;j<a[i].d;j++){
if(dp[i][j][105]<dp[i-1][j-a[i].t][105]+a[i].c){
dp[i][j][0]=dp[i-1][j-a[i].t][0]+1;
for(int k=1;k<dp[i][j][0];k++){
dp[i][j][k]=dp[i-1][j-a[i].t][k];
}
dp[i][j][dp[i][j][0]]=a[i].i;
dp[i][j][105]=dp[i-1][j-a[i].t][105]+a[i].c;
}
if(dp[i][j][105]<dp[i-1][j][105]){
for(int k=0;k<=105;k++){
dp[i][j][k]=dp[i-1][j][k];
}
}
if(dp[i][j][105]>ans||dp[i][j][105]==ans&&dp[i][j][0]<dp[ai][aj][0]){
ans=dp[i][j][105];
ai=i;
aj=j;
}
}
}
cout<<ans<<endl<<dp[ai][aj][0]<<endl;
sort(dp[ai][aj]+1,dp[ai][aj]+dp[ai][aj][0]+1);
for(int i=1;i<=dp[ai][aj][0];i++){
cout<<dp[ai][aj][i]<<" ";
}
}