思路:
动态规划。
设
f[i][j]
表示前
i
个月,剩余存货量为
可以枚举k,表示上个月剩余多少件。
状态转移方程:
f[i][j]=min{f[i−1][k]+k∗m+(j+u[i]−k)∗d[i]}
整理可以得到:
f[i][j]=min{f[i−1][k]+k∗(m−d[i])}+(j+u[i])∗d[i]
其中,
0≤k≤u[i]+j
因为
j
是递增的,所以
代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 10010;
typedef long long ll;
int n, m, s;
int f[55][maxn], u[55], d[55];
int main(){
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]);
for(int i = 1; i <= s; i ++) f[0][i] = 2e9;
for(int i = 1; i <= n; i ++){
int k = 0, res = f[i-1][0];
for(int j = 0; j <= s; j ++){
while(k < min(u[i]+j, s)){k ++; res = min(res, f[i-1][k]+k*(m-d[i]));}
f[i][j] = res + d[i]*(j+u[i]);
}
}
printf("%d", f[n][0]);
return 0;
}