dp[j][k]为打的怪兽i为第j个怪兽,消耗k忍耐度获得的最大经验
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define INF 0x3f3f3f3f
#define NUM 50
using namespace std;
int main()
{
int n, m, k, s;
int exp[100], health[100];
int dp[100][100];
while(~scanf("%d%d%d%d", &n, &m, &k, &s)) {
for(int i=0; i<k; i++) {
scanf("%d%d", &exp[i], &health[i]);
}
memset(dp, 0, sizeof(dp));
for(int i=0; i<k; i++) {
for(int j=1; j<=s; j++) {
for(int k=health[i]; k<=m; k++) {
dp[j][k] = max(dp[j][k], dp[j-1][k-health[i]]+exp[i]);
}
}
}
if(dp[s][m] < n) {
printf("-1\n");
}
else {
for(int i=1; i<=m; i++) {
if(dp[s][i] >= n) {
printf("%d\n", m-i);
break;
}
}
}
}
return 0;
}