题意:中文题意。
思路:如果没有s这个条件,这就是一个完全背包,那么只需要添加一个量来表示杀了几只怪,即可构造出二维dp。
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define ll long long
#define clr(a,b) memset(a,b,sizeof(a))
const int maxn=110;
const int inf=0x3f3f3f;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
int n,m,k,s;
int a[maxn],dp[maxn][maxn],b[maxn];
void completpack(int cost,int weight)
{
for(int i=cost ;i<=m;i++)
{
for(int j=1;j<=s;j++)
dp[i][j]=max(dp[i][j],dp[i-cost][j-1]+weight);
}
}
int flag,res;
int main()
{
while(~scanf("%d%d%d%d",&n,&m,&k,&s))
{
clr(dp,0);flag=0;
flag=0;res=0;
for(int i=0;i<k;i++)
scanf("%d%d",&a[i],&b[i]);
for(int i=0;i<k;i++)
completpack(b[i],a[i]);
int i;
for(i=0;i<=m;i++)
{
if(flag)
break;
for(int j=0;j<=s;j++)
{
if(dp[i][j]>=n)
{
flag=1;
break;
}
}
}
if(flag)
printf("%d\n",m-i+1);
else
puts("-1");
}
return 0;
}