思路:
要注意:最后结果输出时要查找当经验值等于或者大于n时的最小忍耐值m,方可满足最大的保留忍耐值
AC代码:
#include<stdio.h>
#include<string.h>
int dp[100][100],a[100],b[100];
int M,S;
void CompletePack(int c,int w)
{
int m,s;
for(m=c;m<=M;m++)
for(s=1;s<=S;s++)
if(dp[m][s]<dp[m-c][s-1]+w)
dp[m][s]=dp[m-c][s-1]+w;
}
int main()
{
int n,k;
int i;
int max;
int m,s;
int t;
while(scanf("%d%d%d%d",&n,&M,&k,&S)!=-1)
{
for(i=1;i<=k;i++)
scanf("%d%d",&a[i],&b[i]);
memset(dp,0,sizeof(dp));
for(i=1;i<=k;i++)
CompletePack(b[i],a[i]);
if(dp[M][S]<n)printf("-1\n");
else
{
for(m=0;m<=M;m++)
{
t=0;
for(s=0;s<=S;s++)
if(dp[m][s]>=n)
{
t=1;
max=m;
break;
}
if(t)break;
}
printf("%d\n",M-max);
}
}
return 0;
}