#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,T,R,m;
struct node{
int p,s,t,id;
bool operator<(const node e)const{
return s<e.s;
}
}q[1010];
double a[4010][1010],eps=1e-5;
double b[4010][1010];
int ans,an[1010],last[1010];
int id[2010];
void pivot(int x,int y){
swap(id[n+x],id[y]);
double temp=a[x][y];
for(int i=0;i<=n;i++) a[x][i]/=temp;
a[x][y]=1/temp;
for(int i=0;i<=m;i++) if(x!=i){
temp=a[i][y];a[i][y]=0;
for(int j=0;j<=n;j++) a[i][j]-=temp*a[x][j];
}
}
void simplex(){
int x,y;
double mmin;
while(1){
x=y=0;
for(int i=1;i<=n;i++) if(a[0][i]>eps) {y=i;break;}
if(!y) break;
mmin=(double)1e18;
for(int i=1;i<=m;i++) if(a[i][y]>eps && a[i][0]/a[i][y]<mmin) {x=i;mmin=a[i][0]/a[i][y];}
pivot(x,y);
}
return ;
}
void dfs(int x){
for(int i=0;i<=m;i++)
for(int j=0;j<=n;j++)
a[i][j]=b[i][j];
simplex();
if(-a[0][0]<=ans) return ;
if(x==n+1){
ans=(int)-a[0][0];
for(int i=1;i<=m;i++) an[id[n+i]]=(int)a[i][0];
return ;
}
m++;b[m][x]=1;b[m][0]=0;
dfs(x+1);
b[m][x]=-1;b[m][0]=-1;
dfs(x+1);m--;
}
int main(){
scanf("%d %d %d\n",&n,&T,&R);ans=R;
for(int i=1;i<=n;i++) scanf("%d %d %d",&q[i].s,&q[i].p,&q[i].t),q[i].id=i;
sort(q+1,q+1+n);
a[0][0]=-R;
for(int i=1;i<=n;i++) a[0][i]=q[i].p;
for(int i=1;i<=n;i++){
a[i][i]=q[i].s;
for(int j=1;j<i;j++) a[i][j]=-q[j].p;
a[i][0]=R;
}
for(int i=1;i<=n;i++) id[i]=i;
for(int i=1;i<=n;i++) a[n+1][i]=q[i].t;a[n+1][0]=T;
for(int i=1;i<=n;i++) a[n+1+i][i]=1,a[n+1+i][0]=1;
m=n+n+1;
for(int i=0;i<=m;i++)
for(int j=0;j<=n;j++) b[i][j]=a[i][j];
dfs(1);
printf("%d\n",ans);
for(int i=1;i<=n;i++) if(an[i]) last[++last[0]]=q[i].id;
for(int i=1;i<=last[0];i++) printf("%d ",last[i]);
}
草稿
最新推荐文章于 2024-07-15 17:05:45 发布