【算法系列学习】状压dp [kuangbin带你飞]专题十二 基础DP1 D - Doing Homework

本文介绍了一个基于动态规划的作业调度算法实现,通过递归回溯找出最小化作业延期的方法。该算法适用于多个任务的调度场景,能够有效地减少总的延期时间。

https://vjudge.net/contest/68966#problem/D

http://blog.youkuaiyun.com/u010489389/article/details/19218795

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<string>
  5 #include<algorithm>
  6 #include<cmath>
  7 #include<queue>
  8 #define INF 0x3f3f3f3f
  9 using namespace std;
 10 const int maxn=105;
 11 int n;
 12 struct hmwk
 13 {
 14     char ch[maxn];
 15     int d;
 16     int c;
 17 }p[16];
 18 
 19 struct DP
 20 {
 21     int time;
 22     int reduced;
 23     int fa;
 24 }dp[(1<<15)];
 25 
 26 char s[16][101];
 27 
 28 void Init()
 29 {
 30     for(int i=0;i<(1<<15);i++)
 31     {
 32         dp[i].fa=-1;
 33         dp[i].time=0;
 34         dp[i].reduced=INF;    
 35     }    
 36     dp[0].reduced=0;
 37     
 38 }
 39 //按字典序增序输出 
 40 bool cmp(const hmwk&x,const hmwk& y)
 41 {
 42     return strcmp(x.ch,y.ch)<=0;
 43 }
 44 //递归输出,x为当前,fa为前一个 
 45 void Print(int x,int fa)
 46 {
 47     int flag;
 48     if(x==0)
 49     {
 50         for(int i=0;i<n;i++)
 51         {
 52             if(fa&(1<<i))
 53             {
 54                 flag=i;    
 55                 break;
 56             }
 57         }
 58         printf("%s\n",p[flag].ch);
 59         return;
 60     }
 61     Print(dp[x].fa,x);
 62     for(int i=0;i<n;i++)
 63     {
 64         if((x&(1<<i))!=(fa&(1<<i)))
 65         {
 66             flag=i;
 67             break;
 68         }
 69     }
 70     if(x==0)
 71     {
 72         printf("%s\n",p[flag].ch);
 73     }    
 74     else
 75     {
 76         printf("%s\n",p[flag].ch);
 77     }
 78 }
 79 
 80 int main()
 81 {
 82     int T;
 83     scanf("%d",&T);
 84     while(T--)
 85     {
 86         
 87         scanf("%d",&n);
 88         for(int i=0;i<n;i++)
 89         {
 90             scanf("%s%d%d",p[i].ch,&p[i].d,&p[i].c);            
 91         }
 92         sort(p,p+n,cmp);
 93         Init();
 94         //每个i代表一个状态,i的每一位代表一个科目 
 95         for(int i=0;i<(1<<n);i++)
 96         {
 97             for(int k=0;k<n;k++)
 98             {
 99                 //如果是1跳过 
100                 if(i&(1<<k))
101                 {
102                     continue;
103                 }
104                 //now为转移后的状态 
105                 int now=i+(1<<k);
106                 dp[now].time=dp[i].time+p[k].c;
107                 //dp[now].time-p[k].d<0说明没有延期,就是0 
108                 if(dp[i].reduced+max(0,dp[now].time-p[k].d)<dp[now].reduced)
109                 {
110                     dp[now].reduced=dp[i].reduced+max(0,dp[now].time-p[k].d);
111                     dp[now].fa=i;    
112                 } 
113             }
114         }
115         //最终结果就是111111(n个1),对应的数就是(1<<n)-1 
116         printf("%d\n",dp[(1<<n)-1].reduced);
117         Print(dp[(1<<n)-1].fa,(1<<n)-1);
118     }
119     return 0;
120  } 
View Code

 

转载于:https://www.cnblogs.com/itcsl/p/6660025.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、付费专栏及课程。

余额充值