有截止时间的背包,
解:
1、对每一物品的截止时间排序。
2、保证转移到的时间点在截止时间之前即可
#include<bits/stdc++.h>
using namespace std;
const int maxn =2e3+10;
int n,dp[maxn];
vector<int>num[maxn];
struct node{
int t,d,val,ind;
}a[maxn];
#define pb push_back
int rd(){int tt;scanf("%d",&tt);return tt;}
bool cmp(node a,node b){return a.d<b.d;}
signed main(){
#ifdef swt
freopen("input2.txt","r",stdin);
#endif // swt
#define en '\n'
cin>>n;
for(int i=1;i<=n;i++){a[i].t=rd(),a[i].d=rd(),a[i].val=rd();a[i].ind=i;}
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++){
for(int j=maxn-1;j>=a[i].t;--j){
if(j<a[i].d and dp[j]<dp[j-a[i].t]+a[i].val){
dp[j]=dp[j-a[i].t]+a[i].val;
num[j]=num[j-a[i].t];
num[j].pb(a[i].ind);
}
}
}
int ans=-1;
int tem=0;
for(int i=1;i<=maxn-1;i++){
if(ans<dp[i]){
ans=dp[i];
tem=i;
}
}cout<<ans<<en;
cout<<num[tem].size()<<en;
for(auto i:num[tem]){
cout<<i<<' ';
}
}