[CF19B] Checkout Assistant

[CF19B] Checkout Assistant - dp

Description

有 n 件商品,每件有价格 ci 和扫描时间 ti。当正在扫描时,可以花费 1 秒偷走一件。求最少付钱数。扫描商品顺序任意。

Solution

所谓完成,就是当前已有的商品件数不小于 n

对于 ci,ti,我们相当于在增加 ti+1 件商品的同时,花费了 ci 的代价

现在问题就是凑到 n 件商品怎么使得代价最小,即一个 01 背包

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 4005;

int n, t[N], c[N], f[N];

signed main()
{
    ios::sync_with_stdio(false);
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> t[i] >> c[i], ++t[i];
    memset(f, 0x3f, sizeof f);
    f[0] = 0;
    for (int i = 1; i <= n; i++)
        for (int j = N - 1; j >= t[i]; j--)
            f[j] = min(f[j], f[j - t[i]] + c[i]);
    int ans = f[n];
    for (int i = n; i < N; i++)
        ans = min(ans, f[i]);
    cout << ans << endl;
}
原文地址:https://www.cnblogs.com/mollnn/p/14411700.html