『多维DP』P1417 烹调方案

博客围绕食材美味指数问题展开,给定总时间T和n种食材,每种食材有三个属性。该问题权值不固定,选取次序影响最大权值。解题先对食材排序,推导得出排序规则,排好序后使用0-1背包模板求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

洛谷传送门:https://www.luogu.org/problemnew/show/P1417

题意简述:总时间T,有n种食材,每件食材有三个属性,ai,bi和ci,如果在t时刻完成第i样食材则得到ai-t*bi的美味指数,用第i件食材做饭要花去ci的时间。问在T时间内最大美味指数为多少?

乍一看题目,很容易联想到0-1背包,仔细看此题的权值是不固定的,所以选取次序的不同会导致最大权值的不同。

所以我们在进行0-1背包选择前要先对n种食材进行排序。排序无非就是加一个排序规则。

以下是排序规则的推导:

假设有两种食材X、Y。

我们需要权值大的在前面,所以先选X再选Y的权值是要大于先选Y再选X的权值的。

将其转化成数学表达式

a[x]-(p+c[x])*b[x]+a[y]-(p+c[x]+c[y])*by

>

a[y]-(p+c[y])*b[y]+a[x]-(p+c[y]+c[x])*bx

化简可以得到

当X>Y时,c[x]*b[y]<c[y]*b[x]。

可以依此写出排序规则。

排好序后可以直接写一个0-1背包的模板

『代码』

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int Max = 100010;
ll t,n;
ll dp[Max] = {0};
struct Node{
    int a,b,c;
}node[Max];
//排序规则
bool cmp(const Node &a,const Node &b){
    return a.c*b.b < b.c*a.b;
}
int main()
{
    cin>>t>>n;
    for(ll i = 1 ; i <= n; i++) cin>>node[i].a;
    for(ll i = 1 ; i <= n; i++) cin>>node[i].b;
    for(ll i = 1 ; i <= n; i++) cin>>node[i].c;
    sort(node+1,node+n+1,cmp);
    for(ll i = 1 ; i <= n; i++){
        for(ll j = t; j >= node[i].c; j--){    
            dp[j] = max(dp[j],dp[j-node[i].c] +  node[i].a-j*node[i].b);
        }
    }
    ll maxx = -1;
    for(ll i = 0 ; i <= t; i++){
         maxx = max(maxx,dp[i]);
         //cout<<dp[i]<<" ";
    }
    cout<<maxx;
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值