#include <stdio.h>
#include <stdlib.h>
int porownaj_int(const void *i1, const void *i2)
{
return *(int *)i2 - *(int *)i1;
}
int main()
{
int i, j, kont, ile_przedm, ile_plec, l_plec, dalej, wynik, jest, przedm, plec, waga[24], udzwig[100], plecak[24];
long long razem, razem_waga, razem_udzwig, w_plecaku[100];
scanf("%d%d", &ile_przedm, &ile_plec);
for (razem_waga = i = 0; i < ile_przedm; i++)
{
scanf("%d", &waga[i]);
razem_waga += waga[i];
plecak[i] = -1;
}
for (razem_udzwig = i = 0; i < ile_plec; i++)
{
scanf("%d", &udzwig[i]);
razem_udzwig += udzwig[i];
w_plecaku[i] = 0;
}
qsort(waga, ile_przedm, sizeof(int), porownaj_int);
qsort(udzwig, ile_plec, sizeof(int), porownaj_int);
if (waga[0] <= udzwig[0] && razem_waga <= razem_udzwig)
{
for (l_plec = 1, plec = razem = 0; plec < ile_plec; plec++)
{
razem += udzwig[plec];
if (razem < razem_waga)
l_plec++;
else
break;
}
for (dalej = 1; dalej && l_plec <= ile_plec;)
{
// printf("%d\n", l_plec);
for (kont = 1, przedm = 0; kont && przedm < ile_przedm;)
{
for (jest = plec = 0; !jest && plec < l_plec; plec++)
if (waga[przedm] + w_plecaku[plec] <= udzwig[plec])
{
plecak[przedm] = plec;
w_plecaku[plec] += waga[przedm];
jest = 1;
}
if (jest)
przedm++;
else
kont = 0;
}
if (kont)
dalej = 0;
else
{
while (dalej && przedm >= 0)
{
for (przedm--; przedm >= 0 && plecak[przedm] == l_plec; przedm--)
{
plec = plecak[przedm];
w_plecaku[plec] -= waga[przedm];
plecak[przedm] = -1;
}
if (przedm >= 0)
{
plec = plecak[przedm];
w_plecaku[plec] -= waga[przedm];
plecak[przedm] = -1;
for (jest = 0, plec++; !jest && plec < l_plec; plec++)
if (waga[przedm] + w_plecaku[plec] <= udzwig[plec])
{
plecak[przedm] = plec;
w_plecaku[plec] += waga[przedm];
jest = 1;
}
if (jest)
{
for (kont = 1, przedm++; kont && przedm < ile_przedm; przedm++)
{
for (jest = plec = 0; !jest && plec < l_plec; plec++)
if (waga[przedm] + w_plecaku[plec] <= udzwig[plec])
{
plecak[przedm] = plec;
w_plecaku[plec] += waga[przedm];
jest = 1;
}
if (!jest)
kont = 0;
}
if (kont)
dalej = 0;
}
}
}
if (przedm < 0)
l_plec++;
}
}
}
else
l_plec = 0;
if (l_plec)
printf("%d\n", l_plec);
else
printf("NIE\n");
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | #include <stdio.h> #include <stdlib.h> int porownaj_int(const void *i1, const void *i2) { return *(int *)i2 - *(int *)i1; } int main() { int i, j, kont, ile_przedm, ile_plec, l_plec, dalej, wynik, jest, przedm, plec, waga[24], udzwig[100], plecak[24]; long long razem, razem_waga, razem_udzwig, w_plecaku[100]; scanf("%d%d", &ile_przedm, &ile_plec); for (razem_waga = i = 0; i < ile_przedm; i++) { scanf("%d", &waga[i]); razem_waga += waga[i]; plecak[i] = -1; } for (razem_udzwig = i = 0; i < ile_plec; i++) { scanf("%d", &udzwig[i]); razem_udzwig += udzwig[i]; w_plecaku[i] = 0; } qsort(waga, ile_przedm, sizeof(int), porownaj_int); qsort(udzwig, ile_plec, sizeof(int), porownaj_int); if (waga[0] <= udzwig[0] && razem_waga <= razem_udzwig) { for (l_plec = 1, plec = razem = 0; plec < ile_plec; plec++) { razem += udzwig[plec]; if (razem < razem_waga) l_plec++; else break; } for (dalej = 1; dalej && l_plec <= ile_plec;) { // printf("%d\n", l_plec); for (kont = 1, przedm = 0; kont && przedm < ile_przedm;) { for (jest = plec = 0; !jest && plec < l_plec; plec++) if (waga[przedm] + w_plecaku[plec] <= udzwig[plec]) { plecak[przedm] = plec; w_plecaku[plec] += waga[przedm]; jest = 1; } if (jest) przedm++; else kont = 0; } if (kont) dalej = 0; else { while (dalej && przedm >= 0) { for (przedm--; przedm >= 0 && plecak[przedm] == l_plec; przedm--) { plec = plecak[przedm]; w_plecaku[plec] -= waga[przedm]; plecak[przedm] = -1; } if (przedm >= 0) { plec = plecak[przedm]; w_plecaku[plec] -= waga[przedm]; plecak[przedm] = -1; for (jest = 0, plec++; !jest && plec < l_plec; plec++) if (waga[przedm] + w_plecaku[plec] <= udzwig[plec]) { plecak[przedm] = plec; w_plecaku[plec] += waga[przedm]; jest = 1; } if (jest) { for (kont = 1, przedm++; kont && przedm < ile_przedm; przedm++) { for (jest = plec = 0; !jest && plec < l_plec; plec++) if (waga[przedm] + w_plecaku[plec] <= udzwig[plec]) { plecak[przedm] = plec; w_plecaku[plec] += waga[przedm]; jest = 1; } if (!jest) kont = 0; } if (kont) dalej = 0; } } } if (przedm < 0) l_plec++; } } } else l_plec = 0; if (l_plec) printf("%d\n", l_plec); else printf("NIE\n"); return 0; } |
English