#include<iostream>
using namespace std;
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int n,m,k,s;
int dp[105][105];
int a[105],b[105];
while(scanf("%d %d %d %d ",&n,&m,&k,&s)==4)
{
for(int i=0;i<k;i++)
scanf("%d %d",&a[i],&b[i]);
for(i=0;i<=m;i++)
for(int j=0;j<=s;j++)
dp[i][j]=0;
for(i=1;i<=m;i++)
{
for(int j=0;j<k;j++)
{
int cnt=1;
while(b[j]*cnt<=i)
{
for(int t=s;t>=cnt;t--)
dp[i][t]=max(dp[i][t],dp[i-b[j]*cnt][t-cnt]+a[j]);
cnt++;
}
}
if(dp[i][s]>=n) break;
}
if(i>m) printf("-1\n");
else printf("%d\n",m-i);
}
}
hdu 2159 dp(二维完全背包)
最新推荐文章于 2020-04-21 20:39:23 发布