HDU OJ 2159 FATE 【动态规划】

来源:互联网 发布:淘宝专业用语 编辑:程序博客网 时间:2024/06/03 09:16

原题连接:http://acm.hdu.edu.cn/showproblem.php?pid=2159

思路:该题是一个 二为费用完全背包,要满足两个条件,忍耐度,杀怪数,求最大经验。输出达到 升级经验时剩余的最大忍耐度。

代码:

#include<stdio.h>#include<string.h>struct hello{    int x;    int y;}yi[500];int ok[500][500]={0};int main(){    int a,b,c,n,m,k,v1,v2;    while(~scanf("%d%d%d%d",&n,&v1,&k,&v2))    {        memset(ok,0,sizeof(ok));        for(a=0;a<k;a++)            scanf("%d%d",&yi[a].y,&yi[a].x);        for(a=0;a<k;a++)  //三重循环        {            for(b=yi[a].x;b<=v1;b++)            {                for(c=1;c<=v2;c++)                    if(ok[b][c]<ok[b-yi[a].x][c-1]+yi[a].y)  //ok[b][c]代表忍耐度为b,杀怪数为c,所获得的最大经验。                        ok[b][c]=ok[b-yi[a].x][c-1]+yi[a].y;            }        }        int loop=0,sum;        for(a=0;a<=v1;a++)        {            for(b=1;b<=v2;b++)            {                if(ok[a][b]>=n)                    {loop=1;sum=a;break;}            }            if(loop) break;        }        if(loop)            printf("%d\n",v1-sum);        else            printf("-1\n");    }}