zoukankan      html  css  js  c++  java
  • 完全背包度度熊与邪恶大魔王

    度度熊与邪恶大魔王

    Accepts: 263
    Submissions: 1449
    Time Limit: 2000/1000 MS (Java/Others)
    Memory Limit: 32768/32768 K (Java/Others)
    Problem Description

    度度熊为了拯救可爱的公主,于是与邪恶大魔王战斗起来。

    邪恶大魔王的麾下有n个怪兽,每个怪兽有a[i]的生命值,以及b[i]的防御力。

    度度熊一共拥有m种攻击方式,第i种攻击方式,需要消耗k[i]的晶石,造成p[i]点伤害。

    当然,如果度度熊使用第i个技能打在第j个怪兽上面的话,会使得第j个怪兽的生命值减少p[i]-b[j],当然如果伤害小于防御,那么攻击就不会奏效。

    如果怪兽的生命值降为0或以下,那么怪兽就会被消灭。

    当然每个技能都可以使用无限次。

    请问度度熊最少携带多少晶石,就可以消灭所有的怪兽。

    Input

    本题包含若干组测试数据。

    第一行两个整数n,m,表示有n个怪兽,m种技能。

    接下来n行,每行两个整数,a[i],b[i],分别表示怪兽的生命值和防御力。

    再接下来m行,每行两个整数k[i]和p[i],分别表示技能的消耗晶石数目和技能的伤害值。

    数据范围:

    1<=n<=100000

    1<=m<=1000

    1<=a[i]<=1000

    0<=b[i]<=10

    0<=k[i]<=100000

    0<=p[i]<=1000

    Output

    对于每组测试数据,输出最小的晶石消耗数量,如果不能击败所有的怪兽,输出-1

    Sample Input
    1 2
    3 5
    7 10
    6 8
    1 2
    3 5
    10 7
    8 6
    
    Sample Output
    6
    18
    

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int N=100008;
    const int M=1008;
    int a[N],b[N],k[M],p[M];
    int dp[1008][11];
    int main()
    {
        int n,m;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            int maxa=-1,maxb=-1;
            memset(dp,0x7f,sizeof(dp));
            for(int i=0; i<=10; ++i) dp[0][i]=0;
            for(int i=1; i<=n; ++i)
            {
                scanf("%d%d",&a[i],&b[i]);//生命力和防御力
                maxa=max(maxa,a[i]),maxb=max(maxb,b[i]);
            }
            for(int i=1; i<=m; ++i) scanf("%d%d",&k[i],&p[i]);//晶石数量和技能伤害
            for(int i=0; i<=maxb; ++i)
                for(int j=1; j<=maxa; ++j)
                    for(int l=1; l<=m; ++l)
                    {
                        if(p[l]<=i) continue;
                        else dp[j][i]=min(dp[j][i],dp[max(0,j-p[l]+i)][i]+k[l]);
                    }
            long long ans=0;
            bool ok=1;
            for(int i=1; i<=n; ++i)
            {
                if(dp[a[i]][b[i]]==2139062143)
                {
                    ok=0;
                    break;
                }
                ans+=dp[a[i]][b[i]];
            }
            if(!ok)
            {
                puts("-1");
                continue;
            }
            printf("%I64d
    ",ans);
        }
    }
  • 相关阅读:
    Python基础-迭代器
    Python基础-生成器
    Python基础-装饰器
    Python基础-函数
    Python基础-文件操作
    Python基础-集合
    jfinal任务调度quartz(cron) 定时任务 QuartzPlugin
    ServletRequest.getRequestDispatcher
    QuartZ Cron表达式
    Jax-WS WebService实现
  • 原文地址:https://www.cnblogs.com/mfys/p/7290042.html
Copyright © 2011-2022 走看看