首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    HDU 2844 Coins (多重背包+二进制优化)

    首先这是一道多重背包的裸题,题意在代码中的注释里有。多重背包就是所给的物品是有限的(任意个),我们则可以把多重背包的问题转换成01背包和完全背包来求解。首先我们先把01背包和多重背包的过程封装成函数,需要用的时候传参过去就好了,然后我来解释一下什么时候用01背包,什么时候用完全背包。我们先不考虑价值,假如说A的重量是3,有10个,B的重量是5,有2个,而你的背包的最大重量为15。对于A来说,3*10=30,它大于你的背包的最大重量,可以夸张的当成A物品是有无限个的,因为在你背包重量的允许下A物品是想装多少就装多少的,这时候就把A物品当成完全背包来装,而B物品就需要当成两个01背包来装了。这就是多重背包的大致思路,当然对于多重背包还有一个二进制优化,因为如果一个物品在你的背包最大承重范围内的个数太多,这就要装好几次01背包,所以用二进制优化可以缩短同一物品使用01背包的次数。下面我就大致解释一下二进制优化过程。

    05

    Leetcode 368. Largest Divisible Subset

    Given a set of distinct positive integers, find the largest subset such that every pair (Si, Sj) of elements in this subset satisfies: Si % Sj = 0 or Sj % Si = 0. If there are multiple solutions, return any subset is fine.   题目意思也很简单,给出一个不含重复数字的数组,找到最长的一个子数组,子数组里的元素必须两两整除。   这里有个很简单的数学性质,就是整除的传递性,如果a%b==0 且 b%c == 0,那么a%c == 0,说白了如果c是b的因子,b又是a的因子,那么c肯定是a的因子。这样我们就可以在数组中找出很多整除链(a->b->c->d,其中b是a的因子,c是b的因子,d是c的因子),这样的链条就满足两两整除的条件,题目就变成了求最长的链条。   先上代码,然后我再解释下我的代码。

    03
    领券