Problem Description
Input
Output
输出升完这级还能保留的最大忍耐度,如果无法升完这级输出-1。
Sample Input
10 10 1 10
1 1
10 10 1 9
1 1
9 10 2 10
1 1
2 2
Sample Output
0
-1
1
背包问题里的完全背包,
状态转移方程为:f[j][l]=max(f[j][l],f[j-b[i]][l-1]+a[i]),a[i]表示杀死第i个怪获得的经验值,b[i]表示杀死第i个怪消耗的忍耐,
#include<stdio.h>
#include<string.h>
int max (int a,int b)
{
return a>b?a:b;
}
int f[105][105];
int main ()
{
int n,m,k,s;
int flag;
int a[105],b[105];
int i,j,l,h;
while (scanf ("%d%d%d%d",&n,&m,&k,&s)!=EOF)
{
memset (f,0,sizeof(f));
for (i=0;i<k;i++)
{
scanf ("%d%d",&a[i],&b[i]);
}
for(i=0;i<k;i++)
{
for(j=b[i];j<=m;j++)
{
for(l=1;l<=s;l++)
{
f[j][l]=max(f[j][l],f[j-b[i]][l-1]+a[i]);
}
}
}
flag = 0;
for (i=0;i<=m;i++)
{
if(flag)
break;
for (j=0;j<=s;j++)
{
if (f[i][j]>=n)
{
h= i;
flag=1;
break;
}
}
}
if(flag)
printf("%d\n",m-h);
else
printf("-1\n");
}
return 0;
}