bzoj5018 [Snoi2017]英雄联盟
2018-02-28 19:51
204 查看
题目
嗯,其实吧,还是算比较显然的dp。
f[i][j]表示前i个英雄,用了j元钱的最多方案数,最后答案就是满足f[n][j]≥m最小的j了。
转移方法,首先,肯定要枚举i,然后枚举当前买几个皮肤j,再枚举l表示f[i][l]从什么转移过来。注意,每次l的上界是当前买所有皮肤的价格。
这样,一个普通的dp就写完了。
嗯,其实吧,还是算比较显然的dp。
f[i][j]表示前i个英雄,用了j元钱的最多方案数,最后答案就是满足f[n][j]≥m最小的j了。
转移方法,首先,肯定要枚举i,然后枚举当前买几个皮肤j,再枚举l表示f[i][l]从什么转移过来。注意,每次l的上界是当前买所有皮肤的价格。
这样,一个普通的dp就写完了。
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll f[125][250010],m,tmp; int n,c[125],k[125]; int main() { freopen("in.txt","r",stdin); scanf("%d%lld",&n,&m); for(int i=1;i<=n;i++)scanf("%d",&k[i]); for(int i=1;i<=n;i++)scanf("%d",&c[i]); f[0][0]=1; for(int i=1;i<=n;i++) { for(int j=0;j<=tmp;j++)f[i][j]=f[i-1][j]; for(int j=2;j<=k[i];j++) for(int l=c[i]*j;l<=tmp+c[i]*j;l++) f[i][l]=min(m,max(f[i][l],(ll)f[i-1][l-j*c[i]]*j)); tmp+=c[i]*k[i]; } for(int i=0;i<=tmp;i++) if(f [i]>=m)return cout<<i,0; return 0; }
相关文章推荐
- [BZOJ]5018: [Snoi2017]英雄联盟 DP
- [bzoj-5018][Snoi2017]英雄联盟 题解
- bzoj 5018: [Snoi2017]英雄联盟
- 【bzoj5018】[Snoi2017]英雄联盟
- bzoj5018 [Snoi2017]英雄联盟
- bzoj 5018: [Snoi2017]英雄联盟
- 【背包 or STL乱搞】BZOJ5018(Snoi2017)[英雄联盟]题解
- 【BZOJ5018】[Snoi2017]英雄联盟 背包
- 【bzoj5018】[Snoi2017]英雄联盟 背包dp
- BZOJ 5018 [Snoi2017]英雄联盟 动态规划
- [bzoj5018][dp]英雄联盟
- bzoj5016 [Snoi2017]一个简单的询问
- SNOI2017(BZOJ5015~5018)泛做
- loj 2254 bzoj 5016 「SNOI2017」一个简单的询问
- 【bzoj5016】[Snoi2017]一个简单的询问(莫队)
- LOJ——#2256. 「SNOI2017」英雄联盟
- bzoj 5017: [Snoi2017]炸弹 线段树优化建图+tarjan+拓扑排序
- [暴力DP][暴力STL]SNOI2017 && LOJ#2256. 英雄联盟
- bzoj5016 [Snoi2017]一个简单的询问
- 【bzoj5017】[Snoi2017]炸弹 线段树优化建图+Tarjan+拓扑排序