P5365 [SNOI2017]英雄联盟

题目描述

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

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

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

这 N 个英雄中,第 i 个英雄有 Ki 款皮肤,价格是每款Ci Q 币(同一个英雄的皮肤价格相同)。

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

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

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

输入输出格式

输入格式:

第一行,两个整数 N,M。

第二行,N 个整数,表示每个英雄的皮肤数量 Ki

第三行,N 个整数,表示每个英雄皮肤的价格 Ci

输出格式:

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

#include<bits/stdc++.h>
using namespace std;
long long int n,m;
long long f[1000000];
int val[100000],cnt[100000];
inline int read() {
    char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();
    while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
int main()
{
    cin>>n>>m;
    f[0]=1;
    for(int i=1;i<=n;i++)cnt[i]=read();
    for(int i=1;i<=n;i++)val[i]=read();
    for(int i=1;i<=n;i++)
    for(int j=25000;j>=0;j--)
    for(int k=1;k<=cnt[i];k++)
    if(j>=k*val[i])f[j]=max(f[j],f[j-k*val[i]]*k);
    for(int i=1;i<=25000;i++)if(f[i]>=m){cout<<i;return 0;
    }
}
原文地址:https://www.cnblogs.com/SFWR-YOU/p/10887247.html