#include <stdio.h>
#include <stdlib.h>
int my_compare(const void* pierwszy,const void* drugi) {
long a1 = *(long*) pierwszy;
long a2 = *(long*) drugi;
if (a1 > a2) { return -1;}
return 1;
}
int check(int number,long* pck,long* prz,int nr_prz) {
int* lista = (int*) malloc (sizeof(int)*nr_prz);
int akt_prz = 0;
int i = 0;
//for (int i=0;i<number;i++) { printf("%d ",pck[i]); printf("\n"); }
//for (int i=0;i<nr_prz;i++) { printf("%d ",prz[i]); printf("\n"); }
//printf("Numer: %d\n",number);
while(1) {
//printf("%d\n",akt_prz);
//for (int k=0;k<number;k++) { printf("%d ",pck[k]);} printf("\n");
if (akt_prz == nr_prz-1) {
return(1);
}
if (akt_prz <= 0 and i == number) {
return(0);
}
for ( ; i< number;i++) {
if (pck[i] > prz[akt_prz]) {
pck[i] -= prz[akt_prz];
lista[akt_prz] = i;
akt_prz++;
i = 0;
break;
}
}
if (i == number) {
akt_prz--;
pck[ lista[akt_prz] ] += prz[akt_prz];
i = lista[akt_prz]+1;
}
}
}
int main() {
int przedmioty;
int plecaki;
scanf("%d",&przedmioty);
scanf("%d",&plecaki);
long* wagi_prz = (long*) malloc(sizeof(long)*przedmioty);
long* wagi_pck = (long*) malloc(sizeof(long)*plecaki);
for (int i=0;i<przedmioty;i++) { scanf("%ld",wagi_prz+i); }
for (int i=0;i<plecaki;i++) { scanf("%ld",wagi_pck+i); }
qsort((void*)wagi_prz,przedmioty,sizeof(long*),my_compare);
qsort((void*)wagi_pck,plecaki,sizeof(long*),my_compare);
int suma_przedmiotow = 0;
for (int i=0;i<przedmioty;i++) {suma_przedmiotow+=wagi_prz[i];}
int min_plecak = 0; int pakownosc = suma_przedmiotow;
for (int i=0;i<plecaki;i++) {
min_plecak++;
pakownosc -= wagi_pck[i];
if (pakownosc < 0) { break; }
if (min_plecak == plecaki) { printf("NIE\n"); return(0); }
}
for (int i=min_plecak;i<=plecaki;i++) {
int wynik = check(i,wagi_pck,wagi_prz,przedmioty);
if (wynik==1) { printf("%d\n",i); return(0); }
}
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 | #include <stdio.h> #include <stdlib.h> int my_compare(const void* pierwszy,const void* drugi) { long a1 = *(long*) pierwszy; long a2 = *(long*) drugi; if (a1 > a2) { return -1;} return 1; } int check(int number,long* pck,long* prz,int nr_prz) { int* lista = (int*) malloc (sizeof(int)*nr_prz); int akt_prz = 0; int i = 0; //for (int i=0;i<number;i++) { printf("%d ",pck[i]); printf("\n"); } //for (int i=0;i<nr_prz;i++) { printf("%d ",prz[i]); printf("\n"); } //printf("Numer: %d\n",number); while(1) { //printf("%d\n",akt_prz); //for (int k=0;k<number;k++) { printf("%d ",pck[k]);} printf("\n"); if (akt_prz == nr_prz-1) { return(1); } if (akt_prz <= 0 and i == number) { return(0); } for ( ; i< number;i++) { if (pck[i] > prz[akt_prz]) { pck[i] -= prz[akt_prz]; lista[akt_prz] = i; akt_prz++; i = 0; break; } } if (i == number) { akt_prz--; pck[ lista[akt_prz] ] += prz[akt_prz]; i = lista[akt_prz]+1; } } } int main() { int przedmioty; int plecaki; scanf("%d",&przedmioty); scanf("%d",&plecaki); long* wagi_prz = (long*) malloc(sizeof(long)*przedmioty); long* wagi_pck = (long*) malloc(sizeof(long)*plecaki); for (int i=0;i<przedmioty;i++) { scanf("%ld",wagi_prz+i); } for (int i=0;i<plecaki;i++) { scanf("%ld",wagi_pck+i); } qsort((void*)wagi_prz,przedmioty,sizeof(long*),my_compare); qsort((void*)wagi_pck,plecaki,sizeof(long*),my_compare); int suma_przedmiotow = 0; for (int i=0;i<przedmioty;i++) {suma_przedmiotow+=wagi_prz[i];} int min_plecak = 0; int pakownosc = suma_przedmiotow; for (int i=0;i<plecaki;i++) { min_plecak++; pakownosc -= wagi_pck[i]; if (pakownosc < 0) { break; } if (min_plecak == plecaki) { printf("NIE\n"); return(0); } } for (int i=min_plecak;i<=plecaki;i++) { int wynik = check(i,wagi_pck,wagi_prz,przedmioty); if (wynik==1) { printf("%d\n",i); return(0); } } printf("NIE\n"); return(0); } |
English