【发布时间】:2021-06-17 23:04:10
【问题描述】:
给定一组数字,找到任意数字适合的最小倍数和
- 集合中的数字可以多次使用(或根本不使用)来实现“sum”
- 这组数字可以是任何正小数(即
1, 4, 4.5) - 给定/任意数字阈值可以是任何小数(即
5)
替代措辞:
-
找出给定数可以与最小余数相匹配的倍数的组合
-
找到一个数字可以四舍五入的最小“总和”
-
每个组合中使用的实际数字本身对这个特定挑战并不重要
- 虽然锻炼起来也很有趣 ^
目标是找到最小的“总和”(精确的或四舍五入的总和);但是,我很乐意探索/了解其他因素
其他解决方案似乎从精确和
Algorithm for calculating number of fitting boxes
- 不完全是最小零钱问题
其他人说子集和问题的变体
目前解决问题的幼稚伪思维:
- 获取每个的倍数
- 逐步增加所有元素的组合总和(/多个元素的组合;不确定最好的方法)
- 当每个求和器超过给定数字(阈值)时停止
-
mod比较通过给定数字的最小余数 一世。 可能不需要此步骤,具体取决于组合是如何一起/单独构建的 - 已找到总和
认为对于这个或其他明显的 python 示例可能有数学解决方案
https://www.geeksforgeeks.org/find-smallest-range-containing-elements-from-k-lists/
Subset whose sum is the smallest sum over a specific threshold - 我认为这种动态规划非常类似于这里的挑战;但是,对于如何以务实的方式逐步组合/乘法(+记忆)所有潜在的元素组合,我遇到了一些障碍。
递归反向减法在这类问题中效果好吗?
示例测试用例
- 将
[1, 4, 4.5]设置为任意数字5;最小总和 =5(4 + 1) - 设置
[1, 4, 4.5]为任意数5.1;最小总和 =5.5(4.5 + 1) - 将
[20, 40, 9001]设置为任意数88;最小总和 =100(40 + 40 + 20 或 20 + 20 + 20 + 20 + 20,等等) - 将
[20, 40, 9001]设置为任意数字145;最小总和 =160(40 + 40 + 40 + 40 或 20 + 20 + 20 + 20 + 20 + 20 + 20 + 20,等等) - 将
[20, 40, 9001]设置为任意数字9000;最小总和 =9000(我认为是 40 * 225 等) - 将
[20, 40, 9001]设置为任意数字9001;最小总和 =9001(9001,举例说明具有奇怪的不可分割分量的情况,给定任意集合) - 将
[20, 40, 9001]设置为任意数18002;最小总和 =18002(9001 + 9001) - 将
[100, 300, 420]设置为任意数字101;最小总和 =200(100 + 100) - 设置
[100, 300, 420]为任意数398.001;最小总和 =400(300 + 100) - 将
[100, 300, 420]设置为任意数字404;最小总和 =420(420)
感谢您提供任何其他上下文、指针或简单的伪代码解决方案,您可以提供帮助。
【问题讨论】:
-
我将从简化它开始,将问题转换为整数问题:如果值是非整数,则将其表示为分数。然后将所有值(包括所需结果)乘以分母的 LCM。然后取所有值的 GCD。如果它不除所需的总和,则不存在精确的解决方案。如果它确实将它分开,那么可能存在精确解。如果允许负乘数,它肯定会存在。但既然它们似乎不是,它可能不存在。
-
第 8 个测试用例中的最小总和应该是 200 而不是 300?
-
@hilberts_drinking_problem 不,因为任何值都可以使用 0 到多次,所以如果他可以在 1 值中使用它就可以了
-
@Ryan 我认为使用 100 两次导致的余数比使用 300 一次要小。
-
@hilberts_drinking_problem 你是对的,我解释了你是对的,然后继续说,哈哈
标签: javascript python algorithm subset-sum