// g++ knapsack_matrix.cpp #include #include #include // currentVolume: Das restliche (freie) Volumen im Rucksack // i: Aktueller Gegenstand // Return value: Maximaler Wert mit bzw. ohne den aktuellen Gegenstand int knapsack( const int currentVolume, const int i ); // Maximale Anazahl an Gegenständen const int maxN = 10; // Maximales Volumen des Rucksacks const int maxV = 30; // Anzahl an Byte für unseren Dynamisierungs-Array const int resultLength = ( maxV + 1 ) * sizeof( int ); // Volumen des Rucksacks int V; // Anzahl an Gegenständen int n; // Volumen der einzelnen Gegenstände int v[maxN]; // Werte der einzelnen Gegenstände int w[maxN]; // Gespeicherte Ergebnisse von bisherigen Berechnungen int results[maxN][maxV + 1]; int main() { // Eingabe der Daten scanf( "%d %d", &V, &n ); for( int i = 0; i < n; i++ ) scanf( "%d %d", &( v[i] ), &( w[i] ) ); // Initialisierung der Dynamisierungs-Matrix mit -1 for( int i = 0; i < n; i++ ) memset( results[i], -1, resultLength ); // Berechnung und Ausgabe printf( "%d\n", knapsack( V, 0 ) ); // Ausgabe der Gegenstands-Indizes als 1. Zeile printf( " " ); for( int i = 0; i < maxN; i++ ) printf( "%2d ", i ); printf( "\n" ); // Ausgabe der Volumen als 1. Spalte und Werte in der Matrix for( int i = 0; i < maxV + 1; i++ ) { // Volumen ausgeben printf( "%2d ", i ); // Werte in der aktuellen Zeile ausgeben for( int j = 0; j < maxN; j++ ) printf( "%2d ", results[j][i] ); printf( "\n" ); } return 0; } int knapsack( const int currentVolume, const int i ) { if( i < n ) { if( results[i][currentVolume] != -1 ) return results[i][currentVolume]; return results[i][currentVolume] = std::max( knapsack( currentVolume, i + 1 ), ( currentVolume - v[i] >= 0 ) ? ( w[i] + knapsack( currentVolume - v[i], i + 1 ) ) : 0 ); } return 0; }