在我检查过的 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) 我创建了一个索引并使用 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() 一起使用的值,对吗?