【每日一题】22.美味菜肴 ( 01背包变种问题 )

补题链接:Here

首先必须理解到这是一道背包问题,但直接写背包肯定是错的,因为这里多了一个时间的限制:物品价值随时间变化

同样是背包但是先进背包和后进背包有区别
因此需要考虑贪心策略下背包

对于两个物体 A,B 先取 A 物体比先取B 物体优

数学表达

aibici+ajbj(ci+cj)>ajbjcj+aibi(ci+cj):bjci<bicj

排序后进行背包就行了
注意题目要求必须至少做一道菜, 这里有个人尽皆知的小技巧:把 dp 数组初始化为无穷小,且 dp0=0 这样保证至少取一个

using ll    = long long;
const int N = 1 << 20;
ll dp[N];
ll a[N], b[N], c[N], j[N], k[N];
bool cmp(int x, int y) { return b[j[x]] * c[y] > b[j[y]] * c[x]; }
void solve() {
    int n, m, t;
    cin >> n >> m >> t;
    for (int i = 1; i <= n; ++i) cin >> b[i];
    for (int i = 1; i <= m; ++i) cin >> j[i] >> a[i] >> c[i], k[i] = i;
    sort(k + 1, k + 1 + m, cmp);
    memset(dp, -0x3f, sizeof(dp));
    for (int i = 1; i <= m; ++i) {
        int v = k[i];
        for (int l = t; l >= c[v]; --l)
            dp[l] = max(dp[l], dp[l - c[v]] + a[v] - l * b[j[v]]);
    }
    ll ans = -1e18;
    for (int i = 1; i <= t; ++i) ans = max(ans, dp[i]);
    cout << ans << "\n";
}
posted @   RioTian  阅读(70)  评论(0编辑  收藏  举报
编辑推荐:
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 全程不用写代码,我用AI程序员写了一个飞机大战
历史上的今天:
2020-05-10 POJ: 2236 Wireless Network 题解
2020-05-10 世界顶级选手的刷题之道
2020-05-10 LeetCode #188场周赛题解
点击右上角即可分享
微信分享提示