// g++ knapsack_greedy.cpp #include #include // Berechnet den Greedy-Wert aller Gegenstände void rateItems(); // Sortiert Gegenstände nach Greedy-Wert und Volumen (basiert auf Selectionsort) void sortItems(); // 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]; // Maximaler Wert des Rucksacks int maxValue = 0; // Greedy-Bewertung der einzelnen Gegenstände float greedyValues[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] ) ); // Gegenstände bewerten und sortieren rateItems(); sortItems(); // Die besten (nach Greedy-Bewertung) Gegenstände auswählen, die noch Platz haben for( int i = 0; i < n; i++ ) { // Prüfen, ob der Gegenstand noch Platz im Rucksack hat if( V - v[i] >= 0 ) { maxValue += w[i]; V -= v[i]; } } printf( "%d\n", maxValue ); return 0; } void rateItems() { for( int i = 0; i < n; i++ ) greedyValues[i] = (float) w[i] / (float) v[i]; } void sortItems() { int max; int tmp; for( int i = 0; i < n; i++ ) { max = i; for( int j = i + 1; j < n; j++ ) { if( greedyValues[j] > greedyValues[max] ) max = j; else if( greedyValues[j] == greedyValues[max] && v[j] > v[max] ) max = j; } if( max != i ) { tmp = v[max]; v[max] = v[i]; v[i] = tmp; tmp = w[max]; w[max] = w[i]; w[i] = tmp; } } }