解法
完全背包但是又有别的条件(忍耐值为体力经验是价值)
①首先杀怪是有上限s的,所以需要记录杀怪的数量并且if时候还需要加上条件
②最后还得遍历一下从小到大遍历当前dp范围内是不是已经有够经验的那么就可以直接输出忍耐值的差
③最后如果没有经验达到的话那么输出-1
④一定得注意dp更新的时候的条件
代码
#include <bits/stdc++.h>
using namespace std;
int w[1000],v[1000],dp[100000],num[100000];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,m,k,s;
while(cin>>n>>m>>k>>s)
{
int f=0;
memset(dp,0,sizeof(dp));
for(int i=0;i<k;i++)
cin>>w[i]>>v[i];
for(int i=0;i<k;i++)
for(int j=v[i];j<=m;j++)
if(num[j-v[i]]+1<=s&&dp[j]<dp[j-v[i]]+w[i])
{
dp[j]=dp[j-v[i]]+w[i];
num[j]=num[j-v[i]]+1;
}
for(int i=0;i<=m;i++)
if(dp[i]>=n)
{
cout<<m-i<<"
";
f=1;
break;
}
if(!f)
cout<<"-1
";
}
}