BZOJ5018: [Snoi2017]英雄联盟
算算 n 的最大值,∑i=1nk[i] * c[i] <= 243552
这就可以直接上背包了
最裸最暴力的那种
可以选择滚动数组,并不能减掉一维,因为在重复枚举 j 的时候除第一次枚举之外都会用到当前这一层的状态
代码:
#include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<cctype> #include<cstdio> using namespace std; typedef long long ll; const int MAXN = 123; int n, totm; int sum[MAXN], cst[MAXN], ans = 2147483644; ll m; ll f[MAXN][243552]; int main() { scanf("%d%lld", &n, &m); for(int i = 1; i <= n; ++i) scanf("%d", &sum[i]); for(int i = 1; i <= n; ++i) { scanf("%d", &cst[i]); totm += cst[i] * sum[i]; } f[0][0] = 1ll; for(int ii = 1; ii <= n; ++ii) { int i = (ii & 1); for(int k = 0; k <= totm; ++k) { f[i][k] = f[i ^ 1][k]; for(int j = 0; j <= sum[ii] && k >= j * cst[ii]; ++j) { f[i][k] = min(m, max(f[i][k], f[i ^ 1][k - j * cst[ii]] * (ll)j)); if(f[i][k] == m) ans = min(ans, k); } } } printf("%d\n", ans); return 0; }
禁止诸如开发者知识库/布布扣/码迷/学步园/马开东等 copy 他人博文乃至博客的网站转载
,用户转载请注明出处:https://www.cnblogs.com/xcysblog/