分析:看了很久,是一個二維完全揹包問題,dp值來保存獲得的經驗值,循環的是忍耐度和殺怪的數量,每次來比較是否獲得足夠的經驗值,如果有,則退出循環,得到最大值。
代碼:
#include<iostream>
#include<stdio.h>
#include<cstring>
using namespace std;
struct Num{
int w,v;
}num[105];
int dp[105][105];
int main()
{
int n,m,k,s,i,j,p;
while(scanf("%d%d%d%d",&n,&m,&k,&s)!=EOF)
{
for(i=1;i<=k;i++)
scanf("%d%d",&num[i].w,&num[i].v);
memset(dp,0,sizeof(dp));
for(i=1;i<=m;i++)
{
for(j=1;j<=k;j++)
{
for(p=1;p<=s;p++)
{
int flag=1;
while(flag*num[j].v<=i&&flag<=p)
{
dp[i][p]=max(dp[i][p],dp[i-flag*num[j].v][p-flag]+flag*num[j].w);
flag++;
}
}
}
if(dp[i][s]>=n)
break;
}
if(i>m)
printf("-1\n");
else
printf("%d\n",m-i);
}
return 0;
}