#include #include #include using namespace std; int seq[100], input[100], n, b, max_global, count; vector< vector > vec; void monoKnap_ric(int start, int end, int len) { seq[99 - len] = input[end]; bool trovato = false; for (int i = end - 1; i >= start; i--) { if (input[i] <= input[end]) { trovato = true; monoKnap_ric(start, i, len + 1); } } if (!trovato) { int res = 0; vector buf; for(int i = len; i >= 0; i--) { buf.push_back(seq[99-i]); res += seq[99-i]; } if (res > max_global && res <= b) { max_global = res; vec.clear(); count = 1; vec.push_back(buf); } else if (res == max_global) { vec.push_back(buf); count++; } } } /*void monoKnap_din() { for(int i = 0; i < n; i++) for(int j = i; j < n; j++) { int max = 0; bool trovato = false; for(int k = i; k < j; k++) { if (input[k] <= input[j]) { if (mem[i][k] == 0) continue; trovato = true; int res = input[j] + mem[i][k]; if(mem[i][k] > max && res <= b) max = mem[i][k]; } } mem[i][j] = input[j] + max; if (!trovato && i != j) mem[i][j] = 0; if (mem[i][j] > max_global) max_global = mem[i][j]; } }*/ int main(int argc, char* argv[]) { ifstream in("input.txt"); ofstream out("output.txt"); in >> n; in >> b; for(int i = 0; i < n; i++) in >> input[i]; for(int i = 0; i < n; i++) for(int j = i+1; j < n; j++) monoKnap_ric(i, j, 0); /* monoKnap_din(); for(int i = 0; i < n; i++) { for(int j = i; j < n; j++) out << mem[i][j] <<" "; out << endl; }*/ out << max_global << endl; for (int i = 0; i < vec.size(); i++) { for (int j = 0; j < vec[i].size(); j++) out << vec[i][j] << " "; out << endl; } return 0; }