- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
请在下面找到一个问题、它的解决方案和它的工作实现。下面的解决方案的时间复杂度为 O(n!)(如果我错了请指正)。
1)请提出一个时间复杂度更好的解决方案。鉴于这是一个优化问题,动态编程或记忆化似乎是更好的选择。另请提供分析证明您的解决方案的时间复杂性。谢谢!
一家管道公司生产固定长度 n 的管道。它每天收到 k 个管道的订单,每个管道的长度在 (0,n] 之间。编写一个算法来帮助公司使用最少数量的固定长度的管道来完成订单。
对于 k 阶,考虑所有排列。对于每个排列,贪婪地计算成本。选择成本最低的排列。我们需要两个数据结构:1)顺序:使用列表 2)成本:包含所有使用的管道的列表,其中值是管道的剩余长度。如果我们完全使用长度为n的单个管道,则表示成本的数据结构为[0]。
#解决方案 1 的实现
导入 itertools
n = 10
def fulfill_element_greedily(pipes_used, order):
eligible_pipes = filter(lambda x : x - order >= 0, pipes_used)
如果 len(eligible_pipes) == 0:
new_pipe_used = n 阶
别的:
eligible_pipes.sort(反向=真)
new_pipe_used = eligible_pipes[-1] - 顺序
pipes_used.remove(eligible_pipes[-1])
返回 pipes_used + [new_pipe_used]
def cost_for_greedy_fulfill(订单):
pipes_used = []
订单中的订单:
pipes_used = fulfill_element_greedily(pipes_used, order)
返回 len(pipes_used)
def min_cost(订单):
如果(任何( map (lambda x:x > n,订单))):
打印“订单 %s” % str(订单)
raise ValueError("无效订单")
返回 min(map(cost_for_greedy_fulfill,itertools.permutations(orders))) 如果 len(orders)!=0 else 0
定义测试():
断言 0 == min_cost([])
断言 1 == min_cost([1])
断言 1 == min_cost([5])
断言 1 == min_cost([10])
断言 2 == min_cost([10,2])
断言 2 == min_cost([2,9,7])
断言 2 == min_cost([1,7,9,3])
返回“测试通过”
打印测试()
最佳答案
有一个复杂度为O(k*(2^k))的动态规划算法如下:
定义一个包含以下两个成员的状态:
struct State {
int minPipe; // minimum number of pipes
int remainingLen; // remaining length of last pipe
}
我们说状态a比状态b好当且仅当
(a.minPipe < b.minPipe) or (a.minPipe == b.minPipe && a.remainingLen > b.remainingLen)
问题本身可以分为2^k种状态:
State states[2^k]
其中 states[i] 表示已经产生管道 x 的最佳状态(管道的最小数量,最后一个管道的最大剩余长度),(1<=x<=k),其中二进制中的第 x 位i 的表示已设置。
例如,
states[0]: inital state, no pipe produced
states[1]: optimal state with only the 1st pipe produced
states[2]: optimal state with only the 2nd pipe produced
states[3]: optimal state with the 1st and 2nd pipe produced
states[4]: optimal state with only the 3rd pipe produced
...
通过处理每个状态 x 的所有先前状态:
states[x] = 所有可能的先前状态 y 的最佳状态转换,其中 x > y 并且 x 和 y 的二进制表示之间只有 1 位差异。
最终答案来自state[2^k - 1].minPipe;
复杂度:每个状态最多有 (k-1) 个之前的状态,共有 2^k 个状态,所以最终的复杂度为 O(k * 2^k),小于 O(k!)
关于python - 请为优化难题提出更好的解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35056249/
我正在尝试使用 ksoap2 库版本 3.6.2 向 SOAP API 发出请求。 问题是我收到错误消息: "SoapFault - faultcode: 'soap:Server' faultstr
我是 python 3(和一般的 python)的新手,我决定尝试以我自己的方式制作密码和解密作为个人项目。密码通过生成一个随机数并将字母数值乘以它来工作。它将所有这些相乘的值添加到一个列表中,然后在
我在我的 objective-c 项目中使用第 3 方外部框架。我在这个项目中创建了一个 swift 文件来使用该框架。 在 MyModule-Bridging-Header.h 我导入了外部框架头文
目前 .slcache 目录位于 %USER_HOME%\.grails\.slcache里面有大约 12M 的数据。我在受限的公司环境中工作,这导致我的 Windows 配置文件分配出现问题(遗憾的
因此,我目前正在开发一个利用 Google Places API 的原型(prototype),并且正在努力处理此处显示的 API 文档:https://developers.google.com/p
以下代码: t = paramiko.Transport((hostname, port)) t.connect(username=username, password=passwor
我可以在 GitHub 上对其他人的 Gist 提出 pull 请求吗? 我知道我拥有的 Gist 的 fork 、克隆和提交工作流程。我想知道我是否可以请求用我的 fork 更新别人的 Gist 。
我有下一个方法调用: Formatting.git_log_to_html(`git log --no-merges master --pretty=full #{interval}`) interv
我需要一条 sql 语句(或者如果效率更高的话我可以用 Java 执行)来显示汇总表。当我只显示一列统计信息时,它会按我的预期显示: SELECT refresh_job_detail.refres
我是一名优秀的程序员,十分优秀!