传送门
Solution
若设 Fa 为选择付款的商品的 ti 之和为 a 时,支付的最小金额,k 为这些商品的数量。那么只有 a≥n−k 时,Fa 才为一种合法的答案。
但是在 dp 过程中,我们无法把 a 和 k 一起维护。所以选择把上式中的 k 移至左边,启发我们把 Fa 的定义改为选择付款的商品的 ti+1 之和为 a 时,支付的最小金额。这样一来,当 a≥n 时,Fa 为一种合法的答案。
用 01 背包求解所有的 Fa,答案即为满足 a≥n 的最小 Fa。
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| #include <bits/stdc++.h> using namespace std; typedef long long ll;
const ll N = 1e5 + 10;
ll n, t[N], c[N], f[N], T, tot, W, ans = 1e16;
int main() { scanf("%lld", &n); memset(f, 0x3f, sizeof(f)); f[0] = 0; for (int i = 1; i <= n; i++) { scanf("%lld%lld", &t[i], &c[i]); t[i]++; T = max(t[i], T); } T += n; for (int i = 1; i <= n; i++) for (int j = T; j >= t[i]; j--) f[j] = min(f[j], f[j - t[i]] + c[i]); for (int i = n; i <= T; i++) ans = min(ans, f[i]); printf("%lld", ans); return 0; }
|