据我了解,所描述的问题可以通过动态编程以与0/1 Knapsack Problem 非常相似的方式解决。但是,必须调整递归关系。不是在每个阶段考虑2个案例(即丢弃或拿走各自的物品),而是要考虑6个案例,分别对应丢弃该物品(不投资产品),选择1(使用投资1)到选择10(使用投资 10)。尽管每个项目将有 11 个利润值(对于每个选项),但状态空间仍然是二维的(一个轴代表最小权重,即投资金额,一个轴代表项目枚举)。更详细地说,伪代码中的公式可以如下。为了便于演示,在状态空间之外的访问应该产生一个正无穷大的值。
// Input:
// Values (stored in array v_1,...,v_10)
// Weights (stored in arrays w_1,...w_10)
// Number of distinct items (n)
// Knapsack capacity (W)
for j from 0 to W do:
m[0, j] := 0
for i from 1 to n do:
for j from 0 to W do:
m[i, j] := max(m[i-1, j],
m[i-1, j-w_1[i-1]] + v_1[i-1],
...,
m[i-1, j-w_10[i-1]] + v_10[i-1])