[HAOI 2010]订货
Description
某公司估计市场在第 $i$ 个月对某产品的需求量为 $U_i$ ,已知在第 $i$ 月该产品的订货单价为 $d_i$ ,上个月月底未销完的单位产品要付存贮费用 $m$ ,假定第一月月初的库存量为零,第 $n$ 月月底的库存量也为零,问如何安排这 $n$ 个月订购计划,才能使成本最低?每月月初订购,订购后产品立即到货,不进库并供应市场,于当月被售掉则不必付存贮费。假设仓库容量为 $S$ 。
$1\leq n\leq 50,1\leq S\leq 10000$
Solution
记第 $i$ 天后,仓库容量为 $j$ 的最小成本为 $f_{i,j}$ ,容易得到
$$f_{i,j}=\min_{0\leq k\leq \min{S, j+U_i}}{f_{i-1,k}+(j+U_i-k)d_i+jm}$$
这样是 $O(nS^2)$ 的,不过这个式子可以前缀和优化到 $O(nS)$ 。
Code
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 55, S = 10000+5;
int n, m, s, u[N], d[N];
ll f[N][S], minn[N][S];
void work() {
scanf("%d%d%d", &n, &m, &s);
for (int i = 1; i <= n; i++) scanf("%d", &u[i]);
for (int i = 1; i <= n; i++) scanf("%d", &d[i]);
memset(f, 127/3, sizeof(f)); f[0][0] = 0;
memset(minn, 127/3, sizeof(minn));
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= s; j++)
minn[i][j] = min(minn[i][j-1], f[i-1][j]-1ll*j*d[i]);
for (int j = 0; j <= s; j++)
f[i][j] = minn[i][min(s, j+u[i])]+1ll*j*(d[i]+m)+1ll*u[i]*d[i];
}
printf("%lld\n", f[n][0]);
}
int main() {work(); return 0; }
博主蒟蒻,随意转载。但必须附上原文链接:http://www.cnblogs.com/NaVi-Awson/,否则你会终生找不到妹子!!!