- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
来自 Coursera 的算法工具箱类(class)。
问题介绍
您得到一组金条,您的目标是尽可能多地将金条放入包中。每个柱子只有一个副本,对于每个柱子,您可以接受或不接受(因此您不能接受一小部分柱子)。
问题描述
任务。给定 𝑛 金条,找出一袋容量 𝑊 能装下的最大黄金重量。输入格式。输入的第一行包含背包的容量 𝑊 和金条的数量 𝑛。下一行包含 𝑛 个整数 𝑤0,𝑤1, . . . ,𝑤𝑛−1 定义金条的重量。
约束。 1 ≤ 𝑊 ≤ 10^4; 1 ≤ 𝑛 ≤ 300; 0 ≤ 𝑤0, . . . , 𝑤𝑛−1 ≤ 10^5.
输出格式。输出一个容量为𝑊的背包能装下的最大重量的黄金。
我在 Python 中使用动态规划的解决方案:
def optimal_weight(W, w):
golds = [0] + w
gold_dict = {}
for i in range(0, W+1):
gold_dict[(i, golds[0])] = 0
for i in golds:
gold_dict[(0, i)] = 0
for i in range(1, len(golds)):
for weight in range(1, W+1):
gold_dict[(weight, golds[i])] = gold_dict[(weight, golds[i-1])]
if golds[i] <= weight:
val = gold_dict[(weight-golds[i], golds[i-1])] + golds[i]
if gold_dict[(weight, golds[i])] < val:
gold_dict[(weight, golds[i])] = val
return max(gold_dict.values())
第二个输入是金条列表,其重量为整数。对于输入:
10, [1, 4, 8]
结果应为整数 9(即 1+8)。
我测试了一系列示例,包括一些极值,例如:
1, [0]
对于他们所有人来说,结果似乎都是正确的。但是,最终测试一直显示由于错误答案而未通过其中一项测试。因此我的代码中一定有错误。但是我很难找到它。 (作业测试不会释放测试参数,因此无法获取触发错误答案的输入)
有人可以告诉我潜在的问题是什么吗?即使是提示也会非常感激。非常感谢。
编辑:
我添加了 main 函数来显示如何读取输入,但我不认为它链接到潜在的错误:
if __name__ == '__main__':
input = sys.stdin.read()
W, n, *w = list(map(int, input.split()))
print(optimal_weight(W, w))
sys.stdin 将读取带有示例输入的测试 txt 文件,如下所示:
10 3
1 4 8
表示一袋容量为10、3根金条,重量分别为1、4、8。
main方法是题目自带的,没有修改。
Edit2 答案:
感谢以下 Arty 的建议,问题来自使用 gold[i] 作为 gold_dict 的元组键的一部分。如果有多根重量相同的金条,它们在 gold[] 列表中的索引将不同(不同的 i),但它们的 gold[i] 值将相同。在这种情况下,元组键 (weight, gold[i]) 可能会引用错误的对象。
我用我的错误代码对 Arty 的正确代码进行了随机测试,以找到可能触发错误的参数,该错误在运行约 3000 次后出现:
209 38
16, 21, 21, 96, 129, 144, 159, 253, 254, 259, 259, 267, 285, 290, 304, 351, 351, 383, 411, 429, 493, 494, 527, 530, 534, 596, 619, 625, 692, 717, 727, 727, 745, 772, 833, 853, 856, 946
对于这个例子,我的代码将得到答案 208,而正确答案是 202。
修复实际上很简单,只需将所有键元组的 gold[i] 更改为 i 即可:
def optimal_weight(W, w):
golds = [0] + w
gold_dict = {}
for i in range(0, W+1):
gold_dict[(i, 0)] = 0
for i in range(0, len(golds)):
gold_dict[(0, i)] = 0
for i in range(1, len(golds)):
for weight in range(1, W+1):
gold_dict[(weight, i)] = gold_dict[(weight, (i-1))]
if golds[i] <= weight:
val = gold_dict[(weight-golds[i], i-1)] + golds[i]
if gold_dict[(weight, i)] < val:
gold_dict[(weight, i)] = val
return max(gold_dict.values())
最佳答案
我使用 bool 数组 d
实现了自己的解决方案,元素 d[i][j]
为 True
当且仅当权重j
可以通过获取/不获取索引为 0
到 i
的金子以某种方式组成。我们从仅包含 True
的 j = 0
行开始,即权重 0
可以通过不取任何东西来组成。下一行的计算如下 - 如果 d[i - 1][j]
为 True,则元素 d[i][j]
为 True(这对应于不采用当前黄金)或如果 d[i - 1][j - golds[i]]
为真(对应于获取当前黄金)。
关于您的解决方案。我会建议在你的算法中做下一个修正,dict gold_dict
的键应该有第二个元素等于金条的索引,而不是金条的值,即 gold_dict[( weight, gold[i])]
你需要到处使用 gold_dict[(weight, i)]
,尝试做这个修正,也许你的代码适用于所有测试!您已更正此建议 code is here .
我的解决方案代码如下:
def optimal_weight(W, golds):
# We can compose weight 0 by taking nothing
d = [[True] + [False] * W]
for i in range(len(golds)):
# We copy previous row which corresponds to
# solution of not taking current gold
d.append(d[-1][:])
for w in range(golds[i], W + 1):
# Weight w can be composed either by not taking current
# gold (d[-2][w]) or by taking it (d[-2][w - golds[i]])
d[-1][w] = d[-2][w] or d[-2][w - golds[i]]
# It is enough to keep only last row
d = d[-1:]
for w in range(W, -1, -1):
# Return maximal weight w that has True in d
if d[-1][w]:
return w
if __name__ == '__main__':
import sys
W, n, *w = list(map(int, sys.stdin.read().split()))
print(optimal_weight(W, w))
输入:
10 3
1 4 8
输出:
9
关于python - 没有重复的背包 : Maximum Amount of Gold - Python code question,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64724838/
code
正常吗?
我刚刚开始使用 YARD 来记录我的 Rails 应用程序。我没有指定任何特定的标记处理程序,但我希望 `code` 会转换为 code,但这似乎没有发生。这是正常行为吗?我是否必须添加一些额外的选项
什么是Code-Server 首先程序员朋友们肯定都用过来自微软的VS Code 这款轻量而又高级的编辑器,拥有丰富的插件库,支持各种语言编译运行。而本文介绍的Code-Server就是coder 公
我是一名高中生,今年开始学习汇编。 我目前正在制作 Pacman 克隆作为我的最终项目。 我遇到的唯一问题是我的代码很大,*.exe 文件几乎有 64KB。 所以我的问题是,如果我转向模型介质,我需要
锁定。这个问题及其答案是locked因为这个问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 挑战 按字符计数绘制 Code 39 条码的 ASCII 表示的最短代码。 维基百科关于代码 3
我正在开发 VS 代码的扩展(使用 javascript)。现在我需要安装 VS Code 的路径。 windows有一种方法: var child = require('child_process'
[Windows 10] 我在自定义目录中安装了“Microsoft VS Code(用户设置)”,每当我尝试更新它时,都会显示: 然后这个 Log Info Dec 23 11:42:40.673
我正在尝试更新我的 VS 代码,但收到一条错误消息:由于防病毒软件和/或进程失控,更新可能会失败。 附加了一个来 self 的用户的日志文件,但我不确定要检查什么。我对计算机和编程还是个新手。 最佳答
几天前我安装了 Kali Linux。我正在尝试使用 Code-OSS 而不是 VSCode,因为最新版本的 Kali 没有安装普通版本所需的库。 如果我尝试使用 code-oss . 或 code
我正在从 Atom 迁移到 VS Code,因为这似乎是当今所有酷 child 都在使用的东西。 在 atom 中,我能够如图所示突出显示当前行号(装订线中的蓝色突出显示)。 有没有办法在 VS Co
我试图找到一个明确的 G 代码语法规范,而不是单个 G 代码的含义,我无处不在的规范,我的意思是详细的语法规范,目的是编写解析器。 我编写解析器没有问题,我只是在寻找语法规范,例如。我知道您不必总是为
我想在 VS Code (Windows) 中使用 Fira Code,并且已经按照 instructions 中的说明配置了字体。 。不知何故,字体看起来很模糊。我该如何解决这个问题? "edito
这个问题已经有答案了: How can I navigate back to the last cursor position in Visual Studio Code? (16 个回答) 已关闭
如何选择当前单词,即插入符号所在的位置。 注意:我正在寻找 Visual Studio Code(VS Code)(文本编辑器)的快捷方式,而不是 Visual Studio IDE。 最佳答案 在
我需要在 VS Code 中安装 flutter 但在安装扩展中,我有这个错误 Unable to install 'Dart-Code.flutter'; there is no available
memberData
有什么区别
{@code memberData} 和有什么区别?和 memberData在 JavaDoc 中 最佳答案 有两个主要区别: {@code ...}更简洁:更易于阅读(和输入)。 {@code ..
我有这样一个字符串: Here is my code sample, its not too great: [CODE] [/CODE] I hope you enjoy. 现在我想用 highli
在 VS Code 中,我有一个少于 50 个文件的 Vue 项目,但是在运行开发服务器时 VS Code 抛出 Error: ENOSPC: System limit for number of f
Source Code Pro 如何在 VSC 中使用 ExtraLight ~? 似乎以下不起作用...... 我确定我有字体。 Source Code Pro ExtraLight 最佳答案 编辑
我对 Visual Studio Code 很陌生。我正在尝试调试一个已经存在的应用程序,我已经通过 Git 克隆了它。我的文件都没有被修改。我已经下载了微软扩展“C# for Visual Stud
Visual Code VS Visual Studio Code Insider 我还是不明白这两者有什么区别,难道其中一个是新功能的试用版吗? 最佳答案 Visual Studio Code In
我是一名优秀的程序员,十分优秀!