P1417 烹调方案
原题链接
此题是01背包的变形,与传统01背包不同的是每件物品贡献的计算方式
如果在 \(t\) 时刻完成第 \(i\) 样食材则得到 \(a_i - t × b_i\) 的美味指数
这句话意味着食材的美味指数在不同的时间有着不一样的数值,也就是说,烹调的先后顺序会影响得到的美味指数
假设有两样食材 \(i,j\)
\(a_i = 1,b_i = 0,c_i = 1\)
\(a_j = 1,b_j = 1,c_j = 1\)
假设从 \(0\) 时刻开始烹调:
先烹调 \(i\) 再烹调 \(j\) 得到的美味指数:
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 100005;
struct node{
ll a,b,c;
}s[55];
bool cmp(node n1,node n2){
return n2.c * n1.b > n1.c * n2.b;
}
ll dp[N];
int main(){
ll t,n,ans = 0;
cin>>t>>n;
for(int i=1;i<=n;i++) cin>>s[i].a;
for(int i=1;i<=n;i++) cin>>s[i].b;
for(int i=1;i<=n;i++) cin>>s[i].c;
sort(s + 1,s + n + 1,cmp);
for(int i=1;i<=n;i++){
for(int j=t;j>=s[i].c;j--){
dp[j] = max(dp[j],dp[j - s[i].c] + s[i].a - j * s[i].b);
ans = max(ans,dp[j]);
}
}
cout<<ans;
return 0;
}

浙公网安备 33010602011771号