洛谷P5365 [SNOI2017] 英雄联盟 题解

洛谷P5365 [SNOI2017] 英雄联盟 题解

题目链接:P5365 [SNOI2017] 英雄联盟

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

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

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

N \text{N} N 个英雄中,第 i \text{i} i 个英雄有 K i K_i Ki 款皮肤,价格是每款 C i C_i Ci Q 币(同一个英雄的皮肤价格相同)。

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

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

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

题目要求的就是数量要超过 m m m ,并要求价格最少

如果直接dp会带上一些乘法除法的转移,不太好

考虑转化问题,求出每种价格可以获得的最多的数量

那么这就变成了一个类似于多重背包的dp问题

其中价格是费用,即 w [ i ] w[i] w[i]

状态转移方程:
d p [ j ] = max ⁡ 0 ≤ k ≤ min ⁡ ( v [ i ] , ⌊ j w [ i ] ⌋ ) ( d p [ j ] , d p [ j − k × w [ i ] ] × k ) dp[j]=\max_{0 \le k \le \min\left(v[i],\left\lfloor\frac{j}{w[i]}\right\rfloor\right)}(dp[j],dp[j-k\times w[i]]\times k) dp[j]=0kmin(v[i],w[i]j)max(dp[j],dp[jk×w[i]]×k)
代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
#define N (int)(205)
#define M (int)(3e5+15)
int n,m,sum;
int w[N],v[N],dp[M];
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    // freopen("check.in","r",stdin);
    // freopen("check.out","w",stdout);
    cin >> n >> m;
    for(int i=1; i<=n; i++)
        cin >> v[i];
    for(int i=1; i<=n; i++)
    {
        cin >> w[i];
        sum+=w[i]*v[i];
    }
    dp[0]=1;
    for(int i=1; i<=n; i++)
        for(int j=sum; j>=0; j--)
            for(int k=1; k*w[i]<=j&&k<=v[i]; k++)
                dp[j]=max(dp[j],dp[j-k*w[i]]*k);
    int mn=INF;
    for(int i=1; i<=sum; i++)
        if(dp[i]>m){cout << i;return 0;}
    
    return 0;
}

转载请说明出处

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值