#include #define MAXL 10001 int pouzdro[2][MAXL]; int main() { int pocet_segmentu, velikost_pouzdra; int i, j, segment, zmena, aktualni, dalsi; scanf("%d %d", &pocet_segmentu, &velikost_pouzdra); /* Napoprvé vynulujeme pole */ for (i = 0; i <= velikost_pouzdra; i++) { pouzdro[0][i] = 0; } aktualni = 0; dalsi = 1; for (i = 0; i < pocet_segmentu; i++) { /* Nemusíme načítat vstup hned na začátku */ scanf("%d", &segment); /* Musíme si pamatovat, * jestli jsme další díl někam umístili */ zmena = 0; for (j = 0; j <= velikost_pouzdra; j++) { /* Pokud jsme narazili na značku, * tak zkusíme přidat další díl */ if (pouzdro[aktualni][j] == i) { /* Přidávaný díl nesmí vyčnívat * z pouzdra na jedné straně */ if (j - segment >= 0) { /* Do pouzdra pro příští tah * přidáme značku konce */ pouzdro[dalsi][j - segment] = i+1; zmena = 1; } /* Přidávaný díl nesmí vyčnívat * ani na druhé straně */ if (j + segment <= velikost_pouzdra) { pouzdro[dalsi][j + segment] = i+1; zmena = 1; } } } /* Prohodíme pole pouzdra */ j = aktualni; aktualni = dalsi; dalsi = j; /* Pokud segment nikam nepřidáme, * tak se šavle nedá složit */ if (zmena == 0) { printf("Tuto šavli do pouzdra nesložíte.\n"); return 0; } } printf("Tuto šavli dokážeme do pouzdra složit.\n"); return 0; }