zoukankan      html  css  js  c++  java
  • P5365 [SNOI2017]英雄联盟

    题目描述

    正在上大学的小皮球热爱英雄联盟这款游戏,而且打的很菜,被网友们戏称为「小学生」。

    现在,小皮球终于受不了网友们的嘲讽,决定变强了,他变强的方法就是:买皮肤!

    小皮球只会玩  ext{N}N 个英雄,因此,他也只准备给这  ext{N}N 个英雄买皮肤,并且决定,以后只玩有皮肤的英雄。

    这  ext{N}N 个英雄中,第  ext{i}i 个英雄有 K_iKi 款皮肤,价格是每款 C_iCi Q 币(同一个英雄的皮肤价格相同)。

    为了让自己看起来高大上一些,小皮球决定给同学们展示一下自己的皮肤,展示的思路是这样的:对于有皮肤的每一个英雄,随便选一个皮肤给同学看。

    比如,小皮球共有 5 个英雄,这 5 个英雄分别有  ext{0,0,3,2,4}0,0,3,2,4 款皮肤,那么,小皮球就有 3 imes 2 imes 4 = 243×2×4=24种展示的策略。

    现在,小皮球希望自己的展示策略能够至少达到  ext{M}M 种,请问,小皮球至少要花多少钱呢?

    输入格式

    第一行,两个整数  ext{N,M}N,M。

    第二行, ext{N}N 个整数,表示每个英雄的皮肤数量 K_iKi

    第三行, ext{N}N 个整数,表示每个英雄皮肤的价格 C_iCi

    输出格式

    一个整数,表示小皮球达到目标最少的花费。

    输入输出样例

    输入 #1
    3 24
    4 4 4
    2 2 2
    输出 #1
    18

    说明/提示

    样例解释

    每一个英雄都只有4款皮肤,每款皮肤2 Q币,那么每个英雄买3款皮肤,3 imes 3 imes 3 ge 243×3×324,共花费 6 imes 36×3Q币。

    数据范围

    共 10 组数据,第  ext{i}i 组数据满足: ext{N} le max(5, log_2^4i)Nmax(5,log24i)

    ext{100}\%100% 的数据: ext{M} le 10^{17}, 1 le K_i le 10, 1 le C_i le 199M1017,1Ki10,1Ci199。保证有解。

    一眼看上去就是多重背包啦

    定义dp[i][j]dp[i][j] 为选取前i个皮肤花费为j时候的方案数

    那么该英雄花费价钱等于上一个英雄花费价钱+该英雄单个皮肤价钱*选取皮肤个数,由价钱得到上个英雄皮肤方案数后再乘以该英雄皮肤的选取个数。那么需要枚举出选取该英雄皮肤的个数。

    完结撒花!

    ---------------------------------------------------------------------------华丽的分割线------------------------------------------------------------------------------------

    皮一下好开心

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define pc(a) putchar(a)
    #define ps(a) puts(a)
    #define rg register
    const ll maxm=5001;
    const ll maxn=1000001;
    void gc(char &a)
    {for(a=getchar();a==' '||a=='
    ';a=getchar());}
    ll read()
    {
        rg char c;rg ll x=0;bool flag=0;
        for(gc(c);c<'0'||c>'9';gc(c))if(c=='-')flag=1;
        while(c>='0'&&c<='9')
        {x=(x<<1)+(x<<3)+(c^48),c=getchar();}
        return flag? -x:x;
    }
    void pr(ll x)
    {
        if(x<0){pc('-');x=-x;}
        if(x>9) pr(x/10);
        pc(x%10+48);
    }
    
    ll dp[maxn],k[maxn],c[maxn],n,v,m,ans;
    
    int main()
    {
        n=read();
        m=read();
        for(int i=1;i<=n;i++){
            k[i]=read();
        }
        for(int i=1;i<=n;i++){
            c[i]=read(),v+=k[i]*c[i];
        }
        dp[0]=1;
        for(int i=1;i<=n;i++){
            for(int j=v;j>=0;j--) { 
                for(int p=1;p<=k[i]&&p*c[i]<=j;p++){
                    dp[j]=max(dp[j-p*c[i]]*p,dp[j]);
                }
            }
        }
        while(ans<=v&&dp[ans]<m) ans++;
        pr(ans);
        return 0;
    }
  • 相关阅读:
    Oracle函数-DECODE
    WPF模板
    WPF数据编辑的提交与撤销
    WPF数据验证
    WPF多源绑定
    WPF筛选、排序和分组
    WPF绑定到集合
    输出的数据格式是如何决定的-------Asp.net WebAPI学习笔记(二)
    路由其实也可以很简单-------Asp.net WebAPI学习笔记(一)
    终结篇:RemoteWebDriver与Grid简介-----Selenium快速入门(十五)
  • 原文地址:https://www.cnblogs.com/hrj1/p/11566935.html
Copyright © 2011-2022 走看看