您可以将背包问题的这种变体表示为整数程序
标准背包问题:
Maximize sum(j) Value_j x X_j
subject to
sum(j) Wt_j x X_j <= C
X_j is integer
在您的变体中,X_j 只能采用不同的值:{0, 1,3,5,...}
制定约束以限制 X 取奇数值
每当变量可以采用的值存在这些类型的限制时,引入 0/1 变量来处理这些条件。
对于每个项目j
,让我们引入一堆二进制Y变量和几个新约束。
X_j - 1 Y_j1 - 3 Y_j3 - 5 Y_j5 ... - M Y_jm = 0
m 是 Xj 可以取的最大值(奇数)。
为了限制 X_j 假设这些值之一,我们添加
Y_j0 + Y_j1 + Y_j3 + ... + Y_jm = 1 for each item j
Y_j0, Y_j1, Y_j3 ..., Y_jm are {0,1} (binary)
变量 Y_j0 是为了让 X_j 取值 0。
这一事实确保我们可以为每个约束C = n^2
提出合理的上限。m
您现在可以使用整数规划求解器求解这个修改后的背包。它仍然会按“价值密度”(每公斤价值)的递减顺序查找项目,而将其限制为奇数值的约束将在某些边界条件下生效。
希望有帮助。