#include #include #define MAXITEMS 105 #define MAXKNAPSIZE 10005 typedef struct s { int item,value,size,qty; int fincnt; }Item; Item array[MAXITEMS],copy[MAXITEMS]; int save[MAXITEMS]; int cost[MAXKNAPSIZE],best[MAXKNAPSIZE]; int compare(const void* a, const void* b) { if( (*(Item*)a).size > (*(Item*)b).size ) return 1; else if( (*(Item*)a).size < (*(Item*)b).size ) return -1; return 0; } int comp(const void* a, const void* b) { if( (*(Item*)a).item > (*(Item*)b).item ) return 1; else if( (*(Item*)a).item < (*(Item*)b).item ) return -1; return 0; } int main() { int i,j,k,A,B,M,N,currwt =0,s=0,cnt=0,sum=0,max=0,p; scanf("%d %d %d",&N,&A,&B); M=B; for(i=1;i<=N;i++) { array[i].item = i; array[i].fincnt = 0; scanf("%d %d %d",&array[i].value,&array[i].size,&array[i].qty); } qsort(array,N+1,sizeof(Item),compare); for(j=1;j<=N;j++) { for(i=array[j].size;i<=M;i++) { int X = cost[i-array[j].size] + array[j].value; if(cost[i]0;k-=array[best[k]].size) { if(best[k]==j) cnt++; else break; } if(cnt+1<=array[j].qty) { cost[i] = X; best[i] = j; } else { for(s=i;s<=N;s++) { cost[i] = cost[s]; best[i] = best[s]; break; } } } } } for(s=1;s<=N;s++) copy[s] = array[s]; for(k=B;k>=A;k--) { for(s=1;s<=N;s++) array[s] = copy[s]; sum = 0; //for(i=1;i<=N;i++) // array[i].fincnt=0; currwt = k; do { array[best[currwt]].fincnt++; currwt -= array[best[currwt]].size; }while(best[currwt]>0); qsort(array,N+1,sizeof(Item),comp); for(i=1;i<=N;i++) { if(array[i].fincnt>0) sum += (array[i].value*array[i].fincnt); } if(sum>max) { max=sum; for(p=1;p<=N;p++) save[p] = array[p].fincnt; } } if(max>0) { printf("%d\n",max); for(i=1;i<=N;i++) printf("%d\n",save[i]); } else printf("-1\n"); return 0; }