#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
struct node
{
int val,wei;
} a[105];
int dp[105][105];
int main()
{
int n,m,k,s,x,y,z,i;
//升级还需经验值 忍耐度 怪物种数 最多杀怪数
while(~scanf("%d%d%d%d",&n,&m,&k,&s))
{
//怪物的数值 经验 耐久
for(i = 1; i<=k; i++)
scanf("%d%d",&a[i].val,&a[i].wei);
memset(dp,0,sizeof(dp));
//耐久值
for(x = 1; x<=m; x++)
{
//每只怪物
for(y = 1; y<=k; y++)
{
//杀几只怪物
for(z = 1; z<=s; z++)
{
int cnt = 1;
while(cnt*a[y].wei<=x && cnt<=z)
{
//杀z只怪物时 杀cnt只y怪物的值
dp[x][z] = max(dp[x][z],dp[x-cnt*a[y].wei][z-cnt]+cnt*a[y].val);
cnt++;
}
}
}
if(dp[x][s]>=n)
break;
}
if(x>m)
printf("-1\n");
else
printf("%d\n",m-x);
}
return 0;
}
完全背包
最新推荐文章于 2024-09-11 11:20:58 发布