FATE
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 7632 Accepted Submission(s): 3524
#include <stdio.h>
#include <string.h>
int f[150][150] ;
int w[150];
int c[150];
int main()
{
int n, m, kk, s;
int i, j, k;
int flag, cc;
while(scanf("%d %d %d %d", &n, &m, &kk, &s )!=EOF)
{
flag= 0;
memset(f, 0, sizeof(f ));
for(i=0; i<kk; i++)
{
scanf("%d %d", &w[i], &c[i] );
}
for(i=0; i<kk; i++)
{
for(j=c[i]; j<=m; j++)
{
for(k=1; k<=s; k++)
{
if(f[j][k] < (f[j-c[i]][k-1] + w[i]) )
{
f[j][k] = f[j-c[i]][k-1] + w[i] ;
}
}
}
}
for(i=0; i<=m; i++)
{
for(j=1; j<=s; j++)
{
if( f[i][j] >=n )
{
flag=1;
cc = i;
break;
}
}
if(flag==1)
break;
}
if(flag)
printf("%d
", m-cc );
else
printf("-1
");
}
return 0;
}
可将最大忍耐数值m看做背包容积,杀每一个怪所需忍耐值c[i]为每个物品所占体积,获得的经验值w[i]为物品的价值,最大杀敌数s为限制条件,升级所需的经验值n为判断游戏是否结束的条件,敌人种类为k
核心代码;
for(i=0;i<k;i++)
{
for(j=c[i];j<=m;j++)
{
for(x=1;x<s;x++)
{
f[j][k]=max(f[j][k],f[j-c[i]][k-1]+w[i]);
}
}
}
这样就求出了忍耐值为j时杀k个人所能获得的最大经验值。