DP 用记忆化搜索写了一遍,细节问题未考虑清楚。
//此题参考网上代码
#include <stdio.h>
#include <string.h>
#define N 110
int max(int x,int y)
{
return x>y?x:y;
}
int n,m,c,s;
int a[N],b[N];
int f[N][N];
bool input(){
if(scanf("%d %d %d %d",&n,&m,&c,&s)!=4)
return 0;
int i;
for(i=1;i<=c;i++)
scanf("%d %d",a+i,b+i);
memset(f,0,sizeof(f));
return 1;
}
void solve(){
int i,j,k,M;
for(i=1;i<=s;i++){
for(j=1;j<=m;j++){
M=max(f[i-1][j],f[i][j-1]);
for(k=1;k<=c;k++){
if(j>=b[k]) M=max(M,f[i-1][j-b[k]]+a[k]);
}
f[i][j]=M;
}
}
}
void dis(){
int i,j;
if(f[s][m]<n)
printf("-1\n");
else{
for(i=m;;i--){
if(f[s][i]<n)
break;
}
printf("%d\n",m-(i+1));
}
}
int main(){
while(input()){
solve();
dis();
}
return 0;
}