这是我使用动态编程方法解决的经典背包问题。
继here后,我创建了一种类似的方法来确定构成背包的元素类型。我需要找出最终答案的所有方法,而不仅仅是一种方式。我怎样才能做到这一点?
目前,我只能向后工作以找到我的项目添加到最大值的一种方式。但在我的输入中,我可能有两种或更多种方式将项目添加到最大值。我想知道这两种或更多种方式,因为我必须根据某些标准选择一组最佳项目。我怎样才能做到这一点?我应该使用我的DP矩阵或下面的代码吗?
e.g。输入
约束:
maxWeight = 100
i.d./ value / weight
1/50/40
2/40/30
3/30/40
4/50/40
输出:基于约束,我可以有1,2,3或2,3,4
两者加起来相同的分数和重量。我怎样才能确定两者 套?
前奏:
我正在确定该项目在arraylist中的时间属性是否下降 在一定限度内。我已经创建了一个bool数组(wasTaken) 背包方法我放入了本来可以使用的元素 拍摄。在这里,我遍历我的矩阵以确定采取了哪个元素, 然后将项目的id存储在打印(排序后)之后。 INT [] [] 下面的sol表示动态编程中填充的矩阵 先前方法的风格。 i值表示项目和权重 值表示正在考虑的权重。这已经完成了 方式类似于this链接。
我目前的代码:
public static void findElements(boolean[][] wasTaken, int maxWeight, ArrayList<Nodes> items, int[][] sol, int currentTime, int limit) {
int K = maxWeight;
int n = items.size();
int count = 0;
int[] forPrint = new int[n];
for (int i = n-1; i>=0; i--) {
if (wasTaken[i][K] == true && (currentTime - items.get(i).time <= limit)) {
forPrint[i] = items.get(i).index;
count++;
K = K - items.get(i).height;
}
}
Arrays.sort(forPrint);
showResult(count, forPrint);
}
答案 0 :(得分:0)
对于从j
到1
的{{1}},让n
为项p[j]
的利润,让j
为权重。对于从w[j]
到j
的{{1}}和从0
到n
的{{1}}到权重限制,让W
成为从总重量0
不大于opt[j][W]
。在计算1..j
时,我们有重复发生
W
为了枚举所有最佳解决方案,我们以递归和深度优先的方式工作。给定opt
和opt[j][W] = max(p[j] + opt[j - 1][W - w[j]], opt[j - 1][W]) if j > 0 and W ≥ 0,
^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^
item j chosen item j not chosen
0 if j = 0 and W ≥ 0,
-infinity (i.e., infeasible) if W < 0.
,如果这是基本情况,则生成当前所选项目集(如果j
)或根本不产生任何内容(如果W
)。否则,将W ≥ 0
与max的两个参数进行比较。如果它等于第一个参数,则为W < 0
和opt[j][W]
生成所有解决方案,并将项j - 1
添加到所选项集。如果W - w[j]
等于第二个参数,则为j
和opt[j][W]
生成所有解。我们可以产生多个解决方案,因为两个参数可能相等。