忍耐度->容量,经验值->价值,输出达到价值n后的最大剩余容量。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 110;
int n,m,k,s,dp[N][N];
int w[N],c[N];
int main()
{
while(scanf("%d%d%d%d",&n,&m,&k,&s)!=EOF)
{
memset(dp,0,sizeof(dp));
memset(w,0,sizeof(w));
memset(c,0,sizeof(c));
for(int i=0;i<k;i++) scanf("%d%d",&w[i],&c[i]);
for(int i=0;i<k;i++)
for(int j=1;j<=s;j++)
for(int l=c[i];l<=m;l++)
dp[j][l]=max(dp[j][l],dp[j-1][l-c[i]]+w[i]);
int i;
for(i=0;i<=m;i++) if(dp[s][i]>=n) break;
if(i>m) printf("-1\n");
else printf("%d\n",m-i);
}
return 0;
}