Szczegółowe omówienie zadania Klocki z finału Olimpiady Informatycznej Gimnazjalistów:
https://youtu.be/OafWtKkbGmw?t=1291
https://youtu.be/OafWtKkbGmw?t=1291
Zadanie Klocki to klasyczny problem informatyki – problem wydawania reszty.
#include <bits/stdc++.h>
using namespace std;
const int MAX_KLOCKOW=1000010;
int masy_klockow[MAX_KLOCKOW];
int liczba_klockow_dla_wagi[MAX_KLOCKOW]; //dynamik - przechowujemy ile MINIMALNIE klockow trzeba by osiagnac dana wage
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int liczba_wszystkich_klockow, max_mozliwa_liczba_klockow_w_pudelku, maksymalna_masa_pudelka;
int i,j;
cin >> liczba_wszystkich_klockow;
cin >> max_mozliwa_liczba_klockow_w_pudelku;
cin >> maksymalna_masa_pudelka;
for (i=0; i<liczba_wszystkich_klockow; ++i)
cin >> masy_klockow[i];
for (i=0; i<=maksymalna_masa_pudelka; ++i)
liczba_klockow_dla_wagi[i] = -1;
liczba_klockow_dla_wagi[0] = 0;
for (i=0; i<liczba_wszystkich_klockow; ++i) {
if ( masy_klockow[i] > maksymalna_masa_pudelka )
continue;
for (j=maksymalna_masa_pudelka-masy_klockow[i]; j>=0; --j) {
if ( liczba_klockow_dla_wagi[j] == -1 )
continue;
if ( liczba_klockow_dla_wagi[j+masy_klockow[i]] == -1 ) {
liczba_klockow_dla_wagi[j+masy_klockow[i]] = liczba_klockow_dla_wagi[j]+1;
continue;
}
if ( liczba_klockow_dla_wagi[j+masy_klockow[i]] > liczba_klockow_dla_wagi[j] )
liczba_klockow_dla_wagi[j+masy_klockow[i]] = liczba_klockow_dla_wagi[j]+1;
}
}
for (j=maksymalna_masa_pudelka; j>=0; --j) {
if ( liczba_klockow_dla_wagi[j] > 0 ) {
if ( liczba_klockow_dla_wagi[j] <= max_mozliwa_liczba_klockow_w_pudelku ) {
cout << j << "\n";
return 0;
}
}
}
cout << 0 << "\n";
return 0;
}
