#include #include struct good { int pr; int w; int n; int index; double prbw; }; struct good* arr; int n,a,b; int* ans; struct good* orgarr; int compare(const void* a,const void* b) { double temp1,temp2; temp1 = (((struct good*)a) ->prbw); temp2 = (((struct good*)b) ->prbw); if(temp1 < temp2) return 1; else if(temp1 > temp2) return -1; else return 0; } void findans() { qsort(arr,n,sizeof(struct good),compare); //fill knapsack //capacity is b int i = 0,j = 0; long capacity = b; for(i = 0;i < n;i++) { if(capacity <= 0) break; for(j = 1;j <= arr[i].n && capacity > 0;j++) { if(capacity - arr[i].w >= 0) { ans[arr[i].index] = j; capacity -= arr[i].w; } else break; } } } long findmaxpr() { int i = 0; long weight = 0; long maxpr = 0; for(i = 0;i < n;i++) { maxpr += (ans[i]*orgarr[i].pr); weight += (ans[i]*orgarr[i].w); } if(weight < a) { printf("-1"); exit(0); } return maxpr; } int main() { scanf("%d",&n); scanf("%d",&a); scanf("%d",&b); arr = new struct good[n]; ans = new int[n]; orgarr = new struct good[n]; int i = 0; for(i = 0;i < n;i++) { scanf("%d",&(arr[i].pr)); scanf("%d",&(arr[i].w)); scanf("%d",&(arr[i].n)); arr[i].index = i; ans[i] = 0; orgarr[i].index = i; orgarr[i].n = arr[i].n; orgarr[i].pr = arr[i].pr; orgarr[i].w = arr[i].w; arr[i].prbw = ((double)arr[i].pr / (double)arr[i].w); } long maxpr; findans(); maxpr = findmaxpr(); printf("%ld",maxpr); for(i = 0;i < n;i++) printf("\n%d",ans[i]); return 0; }