#include<bits/stdc++.h>
using namespace std;
int noOfItems, items[100], maxWeight, maxItems, value[100];
int dp[100][1000][100];
int solve(int idx, int currentWeight, int itemsLeft){
if(idx == noOfItems || itemsLeft == 0) return 0;
if(dp[idx][currentWeight][itemsLeft] != -1) return dp[idx][currentWeight][itemsLeft];
int v1 = 0, v2 = 0;
//try to included the current item
if(currentWeight >= items[idx]) v1 = solve(idx+1, currentWeight-items[idx], itemsLeft-1) + value[idx];
//exclude current item
v2 = solve(idx+1, currentWeight, itemsLeft);
return dp[idx][currentWeight][itemsLeft] = max(v1, v2);
}
//print the contents of the knapsack
void print(int idx, int currentWeight, int itemsLeft){
if(idx == noOfItems || itemsLeft == 0) return;
int v1 = 0, v2 = 0;
if(currentWeight >= items[idx]) v1 = solve(idx+1, currentWeight-items[idx], itemsLeft-1) + value[idx];
v2 = solve(idx+1, currentWeight, itemsLeft);
if(v1 >= v2){
cout << idx << " " << items[idx] << " " << value[idx] << endl;
print(idx+1, currentWeight-items[idx], itemsLeft-1);
return;
}else{
print(idx+1, currentWeight, itemsLeft);
return;
}
}
int main(){
cin >> noOfItems >> maxWeight >> maxItems;
for(int i = 0;i < noOfItems;i++) cin >> items[i] >> value[i];
memset(dp, -1, sizeof dp);
cout << solve(0, maxWeight, maxItems) << endl; //prints the maximum value that we can get from the constraints
cout << "Printing the elements in the knapsack" << endl;
print(0, maxWeight, maxItems);
return 0;
}
/*
sample Input :
5 15 3
4 6
3 4
5 5
7 3
7 7
*/
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgbm9PZkl0ZW1zLCBpdGVtc1sxMDBdLCBtYXhXZWlnaHQsIG1heEl0ZW1zLCB2YWx1ZVsxMDBdOwppbnQgZHBbMTAwXVsxMDAwXVsxMDBdOwoKaW50IHNvbHZlKGludCBpZHgsIGludCBjdXJyZW50V2VpZ2h0LCBpbnQgaXRlbXNMZWZ0KXsKICAgIGlmKGlkeCA9PSBub09mSXRlbXMgfHwgaXRlbXNMZWZ0ID09IDApIHJldHVybiAwOwogICAgaWYoZHBbaWR4XVtjdXJyZW50V2VpZ2h0XVtpdGVtc0xlZnRdICE9IC0xKSByZXR1cm4gZHBbaWR4XVtjdXJyZW50V2VpZ2h0XVtpdGVtc0xlZnRdOwogICAgaW50IHYxID0gMCwgdjIgPSAwOwogICAgLy90cnkgdG8gaW5jbHVkZWQgdGhlIGN1cnJlbnQgaXRlbQogICAgaWYoY3VycmVudFdlaWdodCA+PSBpdGVtc1tpZHhdKSB2MSA9IHNvbHZlKGlkeCsxLCBjdXJyZW50V2VpZ2h0LWl0ZW1zW2lkeF0sIGl0ZW1zTGVmdC0xKSArIHZhbHVlW2lkeF07CiAgICAvL2V4Y2x1ZGUgY3VycmVudCBpdGVtCiAgICB2MiA9IHNvbHZlKGlkeCsxLCBjdXJyZW50V2VpZ2h0LCBpdGVtc0xlZnQpOwogICAgcmV0dXJuIGRwW2lkeF1bY3VycmVudFdlaWdodF1baXRlbXNMZWZ0XSA9IG1heCh2MSwgdjIpOwp9CgovL3ByaW50IHRoZSBjb250ZW50cyBvZiB0aGUga25hcHNhY2sKdm9pZCBwcmludChpbnQgaWR4LCBpbnQgY3VycmVudFdlaWdodCwgaW50IGl0ZW1zTGVmdCl7CiAgICBpZihpZHggPT0gbm9PZkl0ZW1zIHx8IGl0ZW1zTGVmdCA9PSAwKSByZXR1cm47CiAgICBpbnQgdjEgPSAwLCB2MiA9IDA7CiAgICBpZihjdXJyZW50V2VpZ2h0ID49IGl0ZW1zW2lkeF0pIHYxID0gc29sdmUoaWR4KzEsIGN1cnJlbnRXZWlnaHQtaXRlbXNbaWR4XSwgaXRlbXNMZWZ0LTEpICsgdmFsdWVbaWR4XTsKICAgIHYyID0gc29sdmUoaWR4KzEsIGN1cnJlbnRXZWlnaHQsIGl0ZW1zTGVmdCk7CiAgICBpZih2MSA+PSB2Mil7CiAgICAgICAgY291dCA8PCBpZHggPDwgIiAiIDw8IGl0ZW1zW2lkeF0gPDwgIiAiIDw8IHZhbHVlW2lkeF0gPDwgZW5kbDsKICAgICAgICBwcmludChpZHgrMSwgY3VycmVudFdlaWdodC1pdGVtc1tpZHhdLCBpdGVtc0xlZnQtMSk7CiAgICAgICAgcmV0dXJuOwogICAgfWVsc2V7CiAgICAgICAgcHJpbnQoaWR4KzEsIGN1cnJlbnRXZWlnaHQsIGl0ZW1zTGVmdCk7CiAgICAgICAgcmV0dXJuOwogICAgfQp9CgppbnQgbWFpbigpewogICAgY2luID4+IG5vT2ZJdGVtcyA+PiBtYXhXZWlnaHQgPj4gbWF4SXRlbXM7CiAgICBmb3IoaW50IGkgPSAwO2kgPCBub09mSXRlbXM7aSsrKSBjaW4gPj4gaXRlbXNbaV0gPj4gdmFsdWVbaV07CiAgICBtZW1zZXQoZHAsIC0xLCBzaXplb2YgZHApOwogICAgY291dCA8PCBzb2x2ZSgwLCBtYXhXZWlnaHQsIG1heEl0ZW1zKSA8PCBlbmRsOyAgLy9wcmludHMgdGhlIG1heGltdW0gdmFsdWUgdGhhdCB3ZSBjYW4gZ2V0IGZyb20gdGhlIGNvbnN0cmFpbnRzCiAgICBjb3V0IDw8ICJQcmludGluZyB0aGUgZWxlbWVudHMgaW4gdGhlIGtuYXBzYWNrIiA8PCBlbmRsOwogICAgcHJpbnQoMCwgbWF4V2VpZ2h0LCBtYXhJdGVtcyk7CnJldHVybiAwOwp9CgovKgpzYW1wbGUgSW5wdXQgOgo1IDE1IDMKNCA2CjMgNAo1IDUKNyAzCjcgNwoqLwo=