当前位置:编程学习 > C/C++ >>

HDU OJ 2159 FATE [动态规划]

思路:该题是一个 二为费用完全背包,要满足两个条件,忍耐度,杀怪数,求最大经验。输出达到 升级经验时剩余的最大忍耐度。
代码:
[cpp] 
#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; 
            } 
        }   www.zzzyk.com
        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"); 
    } 

 作者:PIAOYI0208

补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,