/*
dp[j][l] = Max(dp[j][l],dp[j-c[i]][l-1]+w[i])
它表示 用掉了j点的忍耐度,并且杀了l个怪后,所获得的最大经验数。
*/
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
using namespace std;
#define MAX(a, b) (a) > (b) ? (a) : (b)
const int LEN = 105;
int dp[LEN][LEN], a[LEN], b[LEN], n, k, s, m;
int main()
{
int i, j, l;
while( scanf("%d%d%d%d", &n, &m, &k, &s)!=EOF )
{
for(i=0; i<k; i++)
{
scanf("%d%d", &a[i], &b[i]);
}
memset(dp, 0, sizeof(dp));
for(i=0; i<k; i++)
{
for(j=b[i]; j<=m; j++)
{
for(l=1; l<=s; l++)
{
dp[j][l]=MAX(dp[j][l], dp[j-b[i]][l-1]+a[i]);
}
}
}
int flag=0, locate;
for(i=0; i<=m; i++)
{
for(j=0; j<=s; j++)
{
if( dp[i][j] >= n )
{
flag=1;
locate=i;
break;
}
}
if( flag )
break;
}
if( flag )
printf("%d\n", m-locate);
else
printf("-1\n");
}
return 0;
}
hdu 2159 二维完全背包
最新推荐文章于 2020-04-21 20:39:23 发布