#include<stdio.h> #include<string.h> int d[101][101]; int main() { int i,j,t,flag,v,w,n,m,k,s; while(~scanf("%d%d%d%d",&n,&m,&k,&s)){ memset(d,0,sizeof(d)); for(flag=i=0;i<k;++i){ scanf("%d%d",&v,&w); for(j=w;j<=m;++j) for(t=1;t<=s;++t) d[j][t]>?=d[j-w][t-1]+v; } for(flag=i=0;i<=m;++i) if(d[i][s]>=n){ flag=1; break; } if(flag) printf("%d\n",m-i); else puts("-1"); } return 0; }
二维背包问题,把打怪物数量的限制也算上一维,就成了典型的二维背包问题!!