FATE 完全背包 HDU

来源:互联网 发布:中国期刊数据库 编辑:程序博客网 时间:2024/06/05 03:53

思路:

完全背包多加一维,dp[i][j] 表示 杀死i个怪物时,在j耐久时,获得的经验值,如果大于n,则表示此i值是最低花费的耐久

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <cmath>using namespace std;const int maxn=1005;int dp[maxn][maxn];int val[maxn];int price[maxn];int main(){    int n,k,m,s;    while(~scanf("%d%d%d%d",&n,&m,&k,&s))    {        memset(dp,0,sizeof(dp));        for(int i=1;i<=k;i++)        {            scanf("%d%d",&val[i],&price[i]);        }        int ans=0;        for(int i=1;!ans&&i<=m;i++) //忍耐度        {            for(int j=1;j<=k;j++)   //种类            {                for(int l=1;l<=s;l++)        //杀死怪物数量                if(price[j]<=i)                {                    dp[l][i]=max(dp[l][i],dp[l-1][i-price[j]]+val[j]);                }            }            if(dp[s][i]>=n){                ans=1;                printf("%d\n",m-i);                break;            }        }                 if(!ans)            printf("-1\n");    }    return 0;}


0 0
原创粉丝点击