二维背包

来源:互联网 发布:simtrade软件下载 编辑:程序博客网 时间:2024/04/28 16:56
http://acm.hdu.edu.cn/showproblem.php?pid=2159
最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能升掉这最后一级吗?

#include<stdio.h>#include<string.h>int main(){    int i,j,k,n,m,h,s;    int dp[102][102],a1[102],a2[102];    while(~scanf("%d%d%d%d",&n,&m,&k,&s))//经验值,忍耐度,种数,最多杀怪数。    {        memset(dp,0,sizeof(dp));        for(i=1;i<=k;i++)          scanf("%d%d",&a1[i],&a2[i]);//经验值,忍耐度。        for(i=1;i<=k;i++)          for(j=1;j<=s;j++)            for(h=m;h>=a2[i];h--)            {                if(dp[j][h]<dp[j-1][h-a2[i]]+a1[i])                   dp[j][h]=dp[j-1][h-a2[i]]+a1[i];            }        for(i=1;i<=m;i++)  //着没想到啊。          if(dp[s][i]>=n) break;        if(i==m+1) printf("-1\n");        else printf("%d\n",m-i);    }    return 0;}

 
原创粉丝点击