证明0-1整数规划问题是npc问题_动态规划——用二进制表示集合的状态压缩DP

本文是动态规划系列的第五篇,介绍了如何使用二进制表示状态压缩动态规划,以解决0-1整数规划问题。通过二进制表示集合状态,利用状态转移来求解问题,例如旅行商问题。同时,文章探讨了NP问题和状态压缩解法。

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

点击上方蓝字,和我一起学技术。

e31310aa8085e949b62a2146a1f26e67.png

今天是算法与数据结构专题的第16篇,也是动态规划系列的第5篇。

今天文章的内容是动态规划当中非常常见的一个分支——状态压缩动态规划,很多人对于状态压缩畏惧如虎,但其实并没有那么难,希望我今天的文章能带你们学到这个经典的应用。

二进制表示状态

在讲解多重背包问题的时候,我们曾经讲过二进制表示法来解决多重背包。利用二进制的性质,将多个物品拆分成少数个物品,转化成了简单的零一背包来解决。今天的状态压缩同样离不开二进制,不过我个人感觉今天的二进制应用更加容易理解一些。

二进制的很多应用离不开集合这个概念,我们都知道在计算机当中,所有数据都是以二进制的形式存储的。一般一个int整形是4个字节,也就是32位bit,我们通过这32位bit上0和1的组合可以表示多大21亿个不同的数。如果我们把这32位bit看成是一个集合,那么每一个数都应该对应集合的一种状态,并且每个数的状态都是不同的。

0a375928f4601271557a1995ccd4e35c.png

比如上图当中,我们列举了5个二进制位,我们把其中两个设置成了1,其余的设置成了0。我们通过计算,可以得到6这个数字,那么6也就代表了(00110)这个状态。数字和状态是一一对应的,因为每个整数转化成二进制都是唯一的。

也就是说一个整数可以转化成二进制数,它可以代表某个集合的一个状态,这两者一一对应。这一点非常重要,是后面一切推导的基础。

状态转移

整数的二进制表示可以代表一个二元集合的状态,既然是状态就可以转移。在此基础上,我们可以得出另一个非常重要的结论——我们可以用整数的加减表示状态之间的转移

我们还用刚才的例子来举例,上面的图当中我们列举了5个二进制位,假设我们用这5个二进制位表示5个小球,这些小球的编号分别是0到4。这样一来,刚才的6可以认为表示拿取了1号和2号两个小球的状态。

如果这个时候我们又拿取了3号小球,那么集合的状态会发生变化,我们用一张图来表示:

30255a6e6d3a26ff1a4276fbbcc90947.png
上图当中粉丝的笔表示决策,比如我们拿取了3号球就是一个决策,在这个决策的影响下,集合的状
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值