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
#include <iostream>
#include <vector>
#include <climits>
#include <algorithm>

using std::cin;
using std::cout;
using std::endl;
using std::vector;

struct plecak {
	int miejsce;
	int wolne_miejsce;
};

vector<int>	przedmioty;
vector<plecak> plecaki;

typename vector<plecak>::iterator prz_it;

int main() {
	std::ios_base::sync_with_stdio(0);
	int ilosc_przedmiotow,
		ilosc_plecakow;
	cin >> ilosc_przedmiotow
		>> ilosc_plecakow;
	int tmp;
	while(ilosc_przedmiotow--) {
		cin >> tmp;
		przedmioty.push_back(tmp);
	}
	std::sort(przedmioty.begin(), przedmioty.end(), [](int const& a, int const& b) {
		return a > b;
	});
	while(ilosc_plecakow--) {
		cin >> tmp;
		plecak p {tmp, tmp};
		plecaki.push_back(p);
	}
	std::sort(plecaki.begin(), plecaki.end(), [](plecak const& a, plecak const& b) {
		return a.miejsce > b.miejsce;
	});

	int waga_prz;
	bool dodano;
	vector<int>::iterator prz_it = przedmioty.begin();
	int plec_size = plecaki.size();
	while(prz_it != przedmioty.end()) {
		waga_prz = *prz_it;
		dodano = false;
		for(int i = 0; i < plec_size; ++i) {
			if(plecaki[i].wolne_miejsce - waga_prz >= 0) {
				plecaki[i].wolne_miejsce -= waga_prz;
				prz_it = przedmioty.erase(prz_it);
				dodano = true;
				break;
			}
		}
		if(!dodano) {
			cout << "NIE\n";
			return 0;
		}
	}

	int ile_plecakow = 0;
	for(plecak p : plecaki) {
		if(p.wolne_miejsce != p.miejsce) {
			++ile_plecakow;
		}
	}

	cout << ile_plecakow << "\n";

	return 0;
}