// g++ knapsack_recursive.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 = 300; // Maximales Volumen des Rucksacks const int maxV = 1000; // 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]; int main() { // Eingabe der Daten scanf( "%d %d", &V, &n ); for( int i = 0; i < n; i++ ) scanf( "%d %d", &( v[i] ), &( w[i] ) ); // Berechnung und Ausgabe printf( "%d\n", knapsack( V, 0 ) ); return 0; } int knapsack( const int currentVolume, const int i ) { if( i < n ) { // Berechne Wert ohne den aktuellen Gegenstand int a = knapsack( currentVolume, i + 1 ); // Berechne Wert mit dem aktuellen Gegenstand, wenn noch Platz dafür ist int b = 0; if( currentVolume - v[i] >= 0 ) b = w[i] + knapsack( currentVolume - v[i], i + 1 ); // Maximum der Berechnung wird gespeichert und zurückgegeben return std::max( a, b ); } return 0; }