#include #include #include using namespace std; const int MAXN = 100; const int MAXB = 1000; int DFS(int a, int costo, int lista[MAXN], int count); int A[MAXN][MAXN]; int B[MAXN]; int SOLUZIONI[100000][MAXN]; int n,budget,costoMax,riga; int main(){ ifstream fin("input.txt"); assert(fin); fin >> n >> budget; // leggo n e b for(int i = 0; i < n; i++){ fin >> B[i]; } for(int i = 0; i < n; i++){ for(int j = i+1; j < n; j++){ if(B[i] <= B[j]) A[i][j] = 1; } } fin.close(); int costoMigliore = 0, tmp = 0; riga = 0; int lista[MAXN]; for(int i = 0; i < n; i++){ if(costoMigliore < (tmp = DFS(i,0,lista,-1))) costoMigliore = tmp; } ofstream out("output.txt"); out << costoMax << "\n"; int stmp = 0; for(int i = 0; i < riga; i++){ stmp = 0; if(SOLUZIONI[i][0] == costoMax){ while(SOLUZIONI[i][++stmp] != -1){ out << SOLUZIONI[i][stmp] << " "; } out << "\n"; } } out.close(); return 0; } int DFS(int a, int costo, int lista[MAXN],int count){ count++; int ctmp = 0; /*Divido giĆ  da subito i possibili casi*/ if((costo + B[a] > budget)){ if(costo > costoMax){ costoMax = costo; for(int i = 0; i < count; i++){ SOLUZIONI[riga][i+1] = lista[i]; ctmp += lista[i]; } SOLUZIONI[riga][0] = ctmp; SOLUZIONI[riga][++count] = -1; riga++; } return costo; } else if(costo + B[a] == budget){ costoMax = budget; for(int i = 0; i < count; i++){ SOLUZIONI[riga][i+1] = lista[i]; ctmp += lista[i]; } ctmp += B[a]; SOLUZIONI[riga][0] = ctmp; SOLUZIONI[riga][++count] = B[a]; SOLUZIONI[riga][++count] = -1; riga++; return costo + B[a]; } else{ int costoMigliore = costo + B[a], tmp = 0; lista[count] = B[a]; // inserisco nella lista il nodo corrente bool entra = false; for(int i = a+1; i < n; i++){ // Scorro tutti gli altri elementi, ma verifico tramite il dag che siano degli elementi validi if(A[a][i] == 1 && (tmp = DFS(i,costoMigliore,lista,count)) > costoMigliore){ costoMigliore = tmp; if((costoMax < costoMigliore) && (costoMigliore <= budget)) costoMax = costoMigliore; entra = true; } } if(!entra && costoMigliore == costoMax){ SOLUZIONI[riga][0] = costoMigliore; for(int i = 0; i < count; i++){ SOLUZIONI[riga][i+1] = lista[i]; } SOLUZIONI[riga][++count] = -1; riga++; } return costoMigliore; } // fine else }