思路:
完全背包多加一维,dp[i][j] 表示 杀死i个怪物时,在j耐久时,获得的经验值,如果大于n,则表示此i值是最低花费的耐久
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn=1005;
int dp[maxn][maxn];
int val[maxn];
int price[maxn];
int main()
{
int n,k,m,s;
while(~scanf("%d%d%d%d",&n,&m,&k,&s))
{
memset(dp,0,sizeof(dp));
for(int i=1;i<=k;i++)
{
scanf("%d%d",&val[i],&price[i]);
}
int ans=0;
for(int i=1;!ans&&i<=m;i++) //忍耐度
{
for(int j=1;j<=k;j++) //种类
{
for(int l=1;l<=s;l++) //杀死怪物数量
if(price[j]<=i)
{
dp[l][i]=max(dp[l][i],dp[l-1][i-price[j]]+val[j]);
}
}
if(dp[s][i]>=n){
ans=1;
printf("%d\n",m-i);
break;
}
}
if(!ans)
printf("-1\n");
}
return 0;
}