bzoj 5018: [Snoi2017]英雄联盟
2017-09-02 23:15
190 查看
题意:有n个英雄,第i个英雄有k[i]个皮肤,每个皮肤的价格为c[i],求每个英雄的皮肤数的乘积>=m所需要的最小代价(皮肤个数为0的不算)
DP。(tyb大佬说很简单,我再次被d飞)
f[i][j]表示前i个英雄花了j代价的最大乘积。
f[i][k+j∗c[i]]=max{f[i−1][k]∗(j==0?1:j)}<
dba3
/span>
j表示i英雄选几个皮肤,(j==0?1:j)是为了处理一个都不选的情况下,不会把当前值清0。
其实应该是可以滚动的,但我不想打了。反正可以过。
代码:
DP。(tyb大佬说很简单,我再次被d飞)
f[i][j]表示前i个英雄花了j代价的最大乘积。
f[i][k+j∗c[i]]=max{f[i−1][k]∗(j==0?1:j)}<
dba3
/span>
j表示i英雄选几个皮肤,(j==0?1:j)是为了处理一个都不选的情况下,不会把当前值清0。
其实应该是可以滚动的,但我不想打了。反正可以过。
代码:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,k[130],c[130]; long long f[130][260010],m; int main() { 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]); memset(f,0,sizeof(f)); f[0][0]=1; int sum=0; for(int i=1;i<=n;i++) { f[i][0]=1; for(int j=0;j<=k[i];j++) { for(int k=0;k<=sum;k++) { int now=k+j*c[i]; f[i][now]=max(f[i][now],min(m,f[i-1][k]*(j==0?1:j))); } } sum+=k[i]*c[i]; } int ans=0; while(f [ans]<m) ans++; printf("%d",ans); }
相关文章推荐
- 【BZOJ5018】[Snoi2017]英雄联盟 背包
- [BZOJ]5018: [Snoi2017]英雄联盟 DP
- [bzoj-5018][Snoi2017]英雄联盟 题解
- bzoj 5018: [Snoi2017]英雄联盟
- 【bzoj5018】[Snoi2017]英雄联盟
- bzoj5018 [Snoi2017]英雄联盟
- 【背包 or STL乱搞】BZOJ5018(Snoi2017)[英雄联盟]题解
- bzoj5018 [Snoi2017]英雄联盟
- 【bzoj5018】[Snoi2017]英雄联盟 背包dp
- BZOJ 5018 [Snoi2017]英雄联盟 动态规划
- [bzoj5018][dp]英雄联盟
- bzoj 5015: [Snoi2017]礼物
- bzoj 5016: [Snoi2017]一个简单的询问(莫队)
- 【bzoj5016】[Snoi2017]一个简单的询问(莫队)
- LOJ——#2256. 「SNOI2017」英雄联盟
- [莫队] BZOJ5016: [Snoi2017]一个简单的询问
- bzoj5016 [Snoi2017]一个简单的询问
- 【bzoj5017】[Snoi2017]炸弹 线段树优化建图+Tarjan+拓扑排序
- 【BZOJ5016】[Snoi2017]一个简单的询问 莫队
- BZOJ_5015_[Snoi2017]礼物_矩阵乘法