小编use*_*386的帖子

利用0/1背包逻辑递归求解无界背包

在我检查过的 0/1 背包和无界背包的所有 DP 解决方案中,解决方案方法始终定义如下:

0/1 背包:通过拿走第 n 件物品或排除第 n 件物品来最大化总价值。例如0/1背包

无界背包:通过将第n个物品视为最后拾取的物品,或将(n-1)个物品视为最后拾取的物品等来最大化总价值。例如,无界背包

但无界背包也可以使用 0/1 背包的逻辑并稍作调整来解决。我的意思是,对于 0/1 背包,我们执行以下操作(使用第一个链接中的代码):

return max( val[n-1] + knapSack(W-wt[n-1], wt, val, n-1),
            knapSack(W, wt, val, n-1)
          );
Run Code Online (Sandbox Code Playgroud)

请注意,当我们包含时,wt[n-1]我们将数组的大小减少了 1。这意味着wt[n-1]现在已耗尽,因此无法再次使用。但如果在无界的情况下,我们不会将数组大小减少 1(这意味着wt[n-1]可以再次使用),则以下稍微修改的递归关系就可以正常工作:

return max( val[n-1] + knapSack(W-wt[n-1], wt, val, n),
            knapSack(W, wt, val, n-1)
          );
Run Code Online (Sandbox Code Playgroud)

为什么这种无界背包的方法从未在任何地方被提及?其实这里特别说明了,对于无界背包,我们不能使用与0/1背包相同的逻辑。该链接摘录:

Observation:
I can never exhaust any item because there are an unbounded supply of items.
Therefore:
The technique used in the …
Run Code Online (Sandbox Code Playgroud)

algorithm knapsack-problem dynamic-programming

7
推荐指数
1
解决办法
7135
查看次数

如何使用java API在已有的elasticsearch索引中添加更多文档?

我创建了一个索引并使用 java Index API 添加了一个文档。

client.prepareIndex("details", "Key", i).setSource(putJsonDocumentString(Key, Value)).execute().actionGet();
Run Code Online (Sandbox Code Playgroud)

这很好用。索引已创建并且文档已正确索引。现在,我需要在同一索引中添加另一个文档“Keys2”。所以,我这样做了,

client.prepareUpdate("details", "Keys2", i).setScriptParams(putJsonDocumentString(Key, Value)).execute().actionGet();
Run Code Online (Sandbox Code Playgroud)

但是,它没有添加到上述索引中。我不想使用 Bulk API(我一直收到 ClusterBlockedException,它从未解决,而且我也没有太多数据)我找不到任何示例程序做同样的事情。

例外的是:

ActionRequestValidationException:验证失败:1:缺少脚本或文档

我该如何解决这个问题?

putJsonDocumentString() 方法返回一个Map<string, Object>应该与 setScriptParams() 一起使用的值,对吗?

java indexing elasticsearch

5
推荐指数
1
解决办法
2734
查看次数