BZOJ4753: [Jsoi2016]最佳团体

本文介绍了一种解决特定组合优化问题的方法:利用01分数规划与树形依赖背包技术来最大化收益花费比。问题设定为从不超过2500个带有依赖关系的选项中选择若干个,每个选项具有不同的成本和收益。通过调整目标函数中的参数并使用树形结构进行动态规划求解。

$n \leq 2500$个人选$m \leq n$个,每人有花费有收益,还有依赖人,选他前必须选依赖人。问最大的收益花费比。

01分数规划。$\sum p_i-ts_i \leq 0$,这式子成立时要把$t$调小,不成立时要把$t$调大,我们希望$t$大,就尽可能让他不成立,所以就尽可能让左边大。

然后就是树形依赖背包。$f(i,j)$--dfs序上$i$处往后选$j$个的最大值,$f(i,j)=max(f(i+1,j-1)+val_i,f(k,j))$,其中$k$是$i$子树的最后一个节点的下一位。

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 //#include<math.h>
 5 //#include<queue>
 6 //#include<vector>
 7 #include<algorithm>
 8 //#include<iostream>
 9 //#include<assert.h>
10 using namespace std;
11 
12 int n,m;
13 #define maxn 2511
14 double f[maxn][maxn],val[maxn];
15 int p[maxn],s[maxn];
16 
17 struct Edge{int to,next;}edge[maxn<<1]; int first[maxn],le=2;
18 void in(int x,int y) {Edge &e=edge[le]; e.to=y; e.next=first[x]; first[x]=le++;}
19 int id[maxn],rr[maxn],len=0;
20 void predfs(int x,int fa)
21 {
22     id[++len]=x;
23     for (int i=first[x];i;i=edge[i].next)
24     {
25         Edge &e=edge[i]; if (e.to==fa) continue;
26         predfs(e.to,x);
27     }
28     rr[x]=len;
29 }
30 
31 bool check(double x)
32 {
33     for (int i=1;i<=n;i++) val[i]=p[i]-x*s[i];
34     f[len][0]=0; f[len][1]=val[id[len]]; for (int i=2;i<=n+1;i++) f[len][i]=-1e18;
35     for (int i=len-1;i>1;i--)
36     {
37         f[i][0]=0;
38         for (int j=1;j<=len;j++)
39         {
40             f[i][j]=f[i+1][j-1]+val[id[i]];
41             if (rr[id[i]]<len) f[i][j]=max(f[i][j],f[rr[id[i]]+1][j]);
42         }
43     }
44     return f[2][m]<=0;
45 }
46 
47 int main()
48 {
49     scanf("%d%d",&m,&n);
50     for (int i=1,x;i<=n;i++) scanf("%d%d%d",&s[i],&p[i],&x),in(x,i);
51     predfs(0,-1);
52     
53     double L=0,R=1e4+3;
54     while (R-L>1e-4)
55     {
56         double mid=(L+R)/2;
57         if (check(mid)) R=mid; else L=mid;
58     }
59     printf("%.3lf\n",L);
60     return 0;
61 }
View Code

 

转载于:https://www.cnblogs.com/Blue233333/p/8807137.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值