http://acm.hdu.edu.cn/showproblem.php?pid=2159

来源:互联网 发布:mac os x 懒人版下载 编辑:程序博客网 时间:2024/05/16 00:58
/*二维背包:  忍耐度 与 怪的数量dp[i][j]=max(dp[i][j],dp[i-v][j-k]+val[v]);i代表忍耐度,j代表杀怪的数目,dp[i][j]代表获得的经验值。*/#include<iostream>#include<algorithm>#include<cstdio>#include<string.h>using namespace std;int dp[111][111];int val[111],wei[111];int n,m,k,s;int a,b;int max(int a,int b){    return a>b?a:b;}int main(){    int ans;    while(scanf("%d%d%d%d",&n,&m,&k,&s)!=EOF)    {        ans=-1;        for(int i=0; i<k; i++)        {            scanf("%d%d",&val[i],&wei[i]);        }        memset(dp,0,sizeof(dp));        for(int i=0; i<k; i++)            //代表有i中怪物            for(int j=wei[i]; j<=m; j++)  //打怪时的忍耐度                for(int k=1; k<=s; k++)  //代表最多打怪的数目                {                    dp[j][k]=max(dp[j][k],dp[j-wei[i]][k-1]+val[i]);                }        for(int j=0; j<=m; j++)//打怪时的忍耐度            if(dp[j][s]>=n)            {                ans=j;                break;            }        if(ans==-1)         printf("-1\n");        else        printf("%d\n",m-ans);    }    return 0;}

原创粉丝点击