zoukankan      html  css  js  c++  java
  • [HAOI 2010]订货

    Description

    题库链接

    某公司估计市场在第 (i) 个月对某产品的需求量为 (U_i) ,已知在第 (i) 月该产品的订货单价为 (d_i) ,上个月月底未销完的单位产品要付存贮费用 (m) ,假定第一月月初的库存量为零,第 (n) 月月底的库存量也为零,问如何安排这 (n) 个月订购计划,才能使成本最低?每月月初订购,订购后产品立即到货,不进库并供应市场,于当月被售掉则不必付存贮费。假设仓库容量为 (S)

    (1leq nleq 50,1leq Sleq 10000)

    Solution

    记第 (i) 天后,仓库容量为 (j) 的最小成本为 (f_{i,j}) ,容易得到

    [f_{i,j}=min_{0leq kleq 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
    ", f[n][0]);
    }
    int main() {work(); return 0; }
  • 相关阅读:
    java在线预览txt、word、ppt、execel,pdf代码
    java读写文本文件大全
    经典SQL语句大全
    javascript和jQuery知识点总结
    30条经典的SQL语句
    js 树菜单
    一天一记
    笔记本驱动的安装事项[acer]
    拒绝买房的八大理由
    javascript 常用类
  • 原文地址:https://www.cnblogs.com/NaVi-Awson/p/9276367.html
Copyright © 2011-2022 走看看