平分娃娃 - 多重背包问题

蒜头君收集的娃娃需要分成两组,每组萌值之和相同,这是一个01背包问题的变形。通过动态规划求解,但原始方法在某些测试数据上超时。通过二进制优化将物品数量减少,转化为更少的物品进行DP,从而提高效率。提供的Java代码实现了这一优化过程。

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

蒜头君酷爱收集萌萌的娃娃。蒜头君收集了 6 种不同的娃娃,第 i 种娃娃的萌值为 i(1≤ i ≤6)。现在已知每种娃娃的数量 mi,蒜头君想知道,能不能把娃娃分成两组,使得每组的娃娃萌值之和相同。

输入格式
输入一行,输入 6 个整数,代表每种娃娃的数量mi(0≤ mi ≤20,000)。
输出格式
输出一行。如果能把所有娃娃分成萌值之和相同的两组,请输出“Can be divided.”,否则输出“Can’t be divided.”。

样例输入1
2 2 2 2 2 2
样例输出1

Can be divided

样例输入2
2 2 2 2 2 2
样例输出2
Can be divided

这个题的本质就是01背包问题,关键点在于把已知的允许重复存在的物品列表,扩大拆分成每一种物品只允许有一个的列表。

因为知道每一种物品的数量,那就直接在标准输入的for循环中进行“n += num[i];”操作,最后得到的n就是拆分之后得到的物品列表的长度。之后虚拟出一个“可容纳萌值数是总萌值数的一半的”袋子,再通过动态规划求到这个袋子可以装到的最大萌值数。如果装的最大萌值数正好等于总萌值数的一半,那么就说明可以被平分。

但是,这种思路只能通过前四组测试数据,第五组测试数据会显示时间超时。

怎么优化时间复杂度呢?

这里使用的是二进制优化,就是将原本有n件的物品,变成log2n件,例如:原本有14件物品A,转换为:1*A,2*A,4*A和7*A,每个物品A和其前面的系数归并成一件物品,这样就把14件物品转化成4件物品了。

其结构为:{A, A, ... ... , A} >> {1 * A, 2 * A, 4 * A, ... ..., 2^(k - 1) * A, (

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值