用二位数组dp记录用多少忍耐度杀多少只怪可以获得最大的经验
代码:
#include<stdio.h>
#include<string.h>
#define max(x,y) (x>y?x:y)
int a[101],b[101];
int main()
{
int n,m,k,s;
while(~scanf("%d%d%d%d",&n,&m,&k,&s))
{
int i,j,t,temp;
int dp[101][101];
memset(dp,0,sizeof(dp));
for(i=1;i<=k;i++)
scanf("%d%d",&a[i],&b[i]);
for(i=1;i<=k;i++)
for(j=b[i];j<=m;j++)
for(t=1;t<=s;t++)
dp[j][t]=max(dp[j][t],dp[j-b[i]][t-1]+a[i]);//花费j忍耐度杀t只怪可以获得的最大经验
if(dp[m][s]<n)
printf("-1\n");
else
{
for(i=1;i<=m;i++)
if(dp[i][s]>=n)
{
temp=m-i;
break;
}
printf("%d\n",temp);
}
}
}