AT4120-[ARC096D]Sweet Alchemy【贪心,背包】

1|0正题

题目链接:https://www.luogu.com.cn/problem/AT4120


1|1题目大意

给出n个物品和一个容量m,第i个物品体积为ci。除了第一个物品每个物品还有一个pi(pi<i)表示如果pi个物品选择了x个,第i个物品选择了y个要求满足xyx+d

1n50,1m,ci109,0d109,1p<i


1|2解题思路

一个简单的转换,变成一棵树之后选择就变为了一次必须选择一个子树。除了点1外其他最多就只能选择d次。

就变成了一个多重背包,但是容量和体积很大,考虑贪心。因为价值都比较小,对于足够大的情况性价比贪心是对的,所以我们可以考虑先把小的直接做背包,大的贪心选。

背包时每个物品最多选min{n,d}次,设fi表示价值为i时的最小体积,然后枚举一个背包权值,剩下的贪心就好了。二进制分组或者单调队列优化多重背包都能过

时间复杂度O(n4logn)


1|3code

#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=51; struct node{ ll w,v,id; }a[N]; ll n,m,d,p[N],f[N*N*N],ans; bool cmp(node x,node y) {return x.v*y.w>y.v*x.w;} signed main() { scanf("%lld%lld%lld",&n,&m,&d); scanf("%lld",&a[1].w);a[1].v=1;a[1].id=1; for(ll i=2;i<=n;i++) scanf("%lld%lld",&a[i].w,&p[i]),a[i].v=1; for(ll i=n;i>1;i--) a[p[i]].w+=a[i].w,a[p[i]].v+=a[i].v,a[i].id=i; ll mx=n*n*n; memset(f,0x3f,sizeof(f));f[0]=0; for(ll i=1;i<=n;i++){ ll x=min(n,d); for(ll j=1;j<=x;j<<=1){ ll w=a[i].w*j,v=a[i].v*j; for(ll k=mx;k>=v;k--) f[k]=min(f[k],f[k-v]+w); x-=j; } if(!x)continue; ll w=a[i].w*x,v=a[i].v*x; for(ll k=mx;k>=v;k--) f[k]=min(f[k],f[k-v]+w); } sort(a+1,a+1+n,cmp); for(ll p=0;p<=mx;p++){ if(f[p]>m)break; ll v=p,w=f[p],i=1; for(i=1;i<n;i++){ if(a[i].id==1)break; ll x=min(d-min(n,d),(m-w)/a[i].w); w+=x*a[i].w;v+=x*a[i].v; } ll x=(m-w)/a[i].w; w+=x*a[i].w;v+=x*a[i].v; ans=max(ans,v); } printf("%lld\n",ans); return 0; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/14470284.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(43)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示