PKU 2431 Expedition

2431 -- Expedition

#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int main()
{
	int N;
	vector<pair<int, int> > v;
	scanf("%d\n", &N);
	for(int i = 0; i < N; i++){
		int x, y;
		scanf("%d %d\n", &x, &y);
		v.push_back(make_pair(x, y));
	}
	int L, P;
	scanf("%d %d\n", &L, &P);
	sort(v.begin(), v.end());
	vector<pair<int, int> >::reverse_iterator rit = v.rbegin();
	priority_queue<int> pq;
	int cnt = 0;
	while(L){
		if(L == (*rit).first){
			pq.push((*rit).second);
			rit++;
		}
		if(P == 0){
			if(pq.empty()){
				cnt = -1;
				break;
			}
			P += pq.top();
			pq.pop();
			cnt++;
		}
		P--;L--;
	}
	printf("%d\n", cnt);
	return 0;
}

関係ないが動的計画法が理解できない。耳で聞いて概念としては理解できるのだが、自分で実装してみたりできる所までは理解できず、結局なかなか手を出さないまま終了している。誰か僕にも実装ができるように教えてくれ