[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;
}