- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在构建一个应用程序,用于进行少于 10 种不同重量的锻炼。例如:锻炼可能需要 {30,40,45,50,55,65,70,80} 的重量。
现在,如果用户不必确定要抓取多少个 45 磅、35 磅、25 磅等,并且让应用程序显示一个包含每种尺寸的重量数量的表格,那就太好了需要。
我的问题是,鉴于我们有无限数量的 5lb、10lb、25lb、35lb 和 45lb 重量,能够将数组中的每个重量相加的最佳数量是多少?最优是总重量最少,其次是总重量最轻。
例如,假设我想优化 {25, 35, 45},那么如果我的答案数组是 {num_5lbs, num_10lbs, num_25lbs, num_35lbs, num_45lbs} 我们可以做 {0,0,1,1,1}但总重量是 25+35+45=105lbs。我们也可以做 {0,2,1,0,0},我认为这是最优的,因为它有 3 个重量,但总重量只有 45 磅。
另一个例子,假设我想优化 {30,40,50},那么我们可以有 {1,2,1,0,0} 和 {1,1,1,1,0}。两者都使用4个砝码,但前者一共是5+20+25=50磅,而后者一共是5+10+25+35=75磅。
最佳答案
你在我身上发现了竞争激烈的程序员。
使用动态编程(记忆化)我能够将运行时间降低到一个合理的水平。
首先,我们定义了我们拥有的权重类型,以及我们想要达到的目标。
weights = [5, 10, 25, 35, 45]
targets = [30, 40, 45, 50, 55, 65, 70, 80]
接下来是主要的 DP 函数。 walk
采用一个有序的已用权重列表(最初为空)和一个 pos
告诉我们已经考虑了哪些权重(最初为零)。这将 walk
的调用次数从 O(n!)
降低到 O(2^n)
。 walk
也被内存,进一步将执行时间从 O(2^n)
降低到 O(n)
。
有一些基本情况,其中一些是为了性能而动态修改的:
pos >= len(weights)
如果 pos 大于权重的长度,我们已经检查了所有的权重,并且我们完成了递归。 len(used) > max(targets)/min(weights)
这是对要使用的权重数量的弱限制。如果有一种方法可以只使用最小的权重并仍然通过最大的目标,我们就知道我们已经检查了足够多的数字,并且这个分支是无用的。继续前进。len(used) > bwnum
其中 bwnum
是迄今为止最佳答案中使用的权重数。因为这是我们的主要标准,所以当我们选择的权重超过 bwnum
时,我们可以停止递归。这是一个很大的优化,假设我们很快找到任何有效答案。 对于a
和b
这两种情况,我们可以在pos
处选择另一个权重,或者我们可以移动pos
转发。最好的(最短的,然后是最小的总和)被内存并返回。由于有两种情况,我们的分支因子为 2
。
mem = {}
bwnum = len(weights)+1
def walk(used, pos):
k = (used, pos)
global bwnum, weights, targets
if pos >= len(weights) or len(used) > bwnum or len(used) > max(targets) / min(weights):
return used if valid(used) else (1e9,)*(bwnum+1)
if k not in mem:
a = walk(used + (weights[pos],), pos)
b = walk(used, pos + 1)
mem[k] = a if len(a) < len(b) or (len(a) == len(b) and sum(a) < sum(b)) else b
if valid(mem[k]):
bwnum = min(bwnum, len(mem[k]))
return mem[k]
然后我们需要一个验证器函数来检查给定的权重列表是否足以达到所有目标。这可以进一步优化,但速度非常快。我将 80% 的执行时间花在了这个函数上。
from itertools import combinations
vmem = {}
def valid(used):
if used not in vmem:
tmap = {}
for t in targets:
tmap[t] = 0
for le in range(1, len(used) + 1):
for c in combinations(used, le):
if sum(c) in tmap:
del tmap[sum(c)]
vmem[used] = len(tmap) == 0
return vmem[used]
最后,用空参数调用walk
,并打印结果。
r = walk((), 0)
print r, len(r), sum(r)
哪些输出:
(5, 5, 10, 25, 35) 5 80
哦,顺便说一句,你的例子是正确的。谢谢。
关于algorithm - 扭转硬币变化(最小化权重数组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36925738/
嘿伙计们。 实现背景变化(基本上是幻灯片放映)和过渡效果的常见方法有哪些。我想每隔一段时间改变complte文档背景。 我是一名 ASP.net 开发人员,并且希望大部分内容都可以在 ASP 中实现。
也许,指针已经在修改过程中指向 auto_ptr 的常规指针指向 unique_ptr 和 shared_ptr 我只是想知道已经开发出来的新型指针是否完全覆盖了旧版本(或者您可能认为存在内存泄漏问题
我使用 Android Studio 构建 Android 应用。 我的问题是:当 fragment 改变时,应用程序崩溃。 控制台输出[控制台] 01-06 18:35:21.952 27756-
****澄清**我做了这个 [Fiddle] ( http://jsfiddle.net/sggPv/10/ ) 来帮助澄清情况。 该脚本起初适用于两个表格,但随后当您点击 slider 并将新表格加
我有图标,单击它会将新的 div(列)添加到 div 容器。问题是,当新的 div(列)出现时,按钮不会向右移动。是否可以以某种方式仅在 div 内添加 position:fixed? 这是我的几个屏
我是 Java 新手,继承了现有的 Android 应用程序。原始开发人员选择使用常量接口(interface)。 我的问题是我需要更改其中一些常量来编译生产应用程序与开发应用程序。如果我手动修改一些
在 Apple developer Document 中,我在 UIColor 中发现了一些新东西。 If your app was linked on or after iOS 10 and whe
我没有经常使用 ShareKit,但我只想拥有三个共享选项:Facebook、Twitter 和电子邮件。 ShareKit 提供了更多选项,包括更多按钮。但是,我不想要“更多”选项,只想要三个。 在
我正在构建一个 JS 库,其中一个用例要求我在 DOM 更改时触发一个事件,特别是如果它是一个单页应用程序,例如:github search bar 经过一番研究,我遇到了MutationObserv
我已经设法编写了一个代码来检测任何工作表中特定单元格的值变化,但我一直在努力构建检测和跟踪范围(值)变化的东西。 例如,如果用户决定复制和粘贴某个范围的数据(假设超过 1 个单元格),它不会被宏捕获。
使用 ffmpeg ,我们可以对音频电平进行多少控制?例如,我想在程序的时间轴上映射一个“M”形: t0 - t1 : fade in from 0 to 1 t1 - t2 : play at fu
使用 jQuery 1.7.1,我尝试为下拉列表上的更改事件创建一个事件处理程序。下拉列表会动态添加到 DOM 中。似乎在大多数浏览器上都能很好地工作,但是哦,奇怪的 IE8 想要变得困难。有解决方法
我想制作一个具有可选边框大小的自定义控件。请参阅下面的代码。边框绘制在非客户区,其宽度可以是 0、1 或 2 像素。我已经在 WM_NCPAINT 中成功完成了边框绘制。问题是,在更改控制边框大小的属
我知道这个问题之前已经被问过,而且我实际上已经找到了一些我已经实现的解决方案。不幸的是,我没能得到我想要的。 我以前没有做过AngularJS,我想做的是: 检测网址何时更改 根据网址更改的内容进行一
我有一个 auto-carousel 指令,它循环访问链接元素的子元素。 但是,子级尚未加载到 DOM 中,因为它们的 ng-if 表达式尚未解析。 如何确保父指令知道其 DOM 树已发生更改?
我有一个流程可以通过内容提供商从数据库中获取数据。 fun getDataFlow(): Flow { return flow { emit(Result.Loading)
我有一些有效的代码,但有时它只是“跳转”到其他文本而不考虑间隔。 该代码基本上按时间间隔更改标题的文本。 var text = ["text1", "text2", "text3","text4","
我正在尝试将 onCLick 监听器添加到我的 PreferenceScreen 上的开关,但它不起作用。我尝试了 Java 教程中的代码并将其转换为 Kotlin,但由于某种原因它无法正常工作。 这
我们目前正在尝试升级我们的程序使用的 ffmpeg 版本。跳跃很大,因为我们目前使用的是 ffmpeg 0.8,最新版本是 1.2。 在这些测试中,我使用的是(让我说)我发现的令人惊叹的软件包 her
我有一个流程可以通过内容提供商从数据库中获取数据。 fun getDataFlow(): Flow { return flow { emit(Result.Loading)
我是一名优秀的程序员,十分优秀!