HDU-2159 完全背包
#include<bits/stdc++.h>
using namespace std;
#define MAXN 105
#define inf 0x3f3f3f3f
int dp[MAXN*150][MAXN];
int main(){
int n,m,k,s;
while(cin>>n>>m>>k>>s){
int w[MAXN],v[MAXN];
int plus=0;
for(int i=1;i<=k;i++){
scanf("%d",&v[i]);//经验值
scanf("%d",&w[i]);//忍耐度
}
memset(dp,0x3f,sizeof(dp));//忍耐度下的的最大经验值
dp[0][0]=0;
for(int i=1;i<=k;i++){
for(int j=v[i];j<=n+2050;j++){
for(int l=1;l<=s;l++){
dp[j][l]=min(dp[j][l],dp[j-v[i]][l-1]+w[i]);
}
}
}
int ans=inf;
for(int j=n;j<=n+2050;j++){
for(int l=1;l<=s;l++){
if(dp[j][l]<=m)
ans=min(ans,dp[j][l]);
}
}
if(ans==inf){
cout<<"-1"<<endl;
}
else {
cout<<m-ans<<endl;
}
}
return 0;
}