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; } }