如何解决存储最优解
我有这个代码:
public static void main(String[] args) {
final int[] weights = {20,40,10,30},costs = {5,20,2,6};
final int minWeight = 50;
firstSolution(weights,costs,minWeight);
}
public static void firstSolution(int[] weights,int[] costs,int minWeight){
int maxWeight = 0;
for(final int weight: weights){
maxWeight += weight;
}
int[] minCost = new int[maxWeight + 1];
for(int i = 1; i <= maxWeight; i++){
minCost[i] = Integer.MAX_VALUE;
}
for(int i = 0; i < weights.length; i++){
for(int j = maxWeight; j >= weights[i]; j--){
if(minCost[j - weights[i]] != Integer.MAX_VALUE){
minCost[j] = Math.min(minCost[j],minCost[j - weights[i]] + costs[i]);
}
}
}
int answer = Integer.MAX_VALUE;
for(int i = minWeight; i <= maxWeight; i++){
answer = Math.min(answer,minCost[i]);
}
System.out.println(answer);
}
此代码将权重数组和成本数组作为输入,并计算给定最小权重的最低可能成本>.我实际上还需要知道哪些项目用于此解决方案。
例如,对于这些输入,我将作为我的最佳解决方案:
使用 索引 0(权重 = 20,成本 = 5)和 索引 3 的项目(重量 = 30,成本 = 6)。
这会给我最低成本,即大于或等于 50 的重量为 11。
该代码有效,并为我提供了最低成本的答案 11,但它并未提供导致此解决方案的实际项目。您能否帮助稍微更改一下代码,以便它也可以确定哪些项目会导致最佳解决方案?
解决方法
当您执行以下操作时:
minCost[j] = Math.min(minCost[j],minCost[j - weights[i]] + costs[i]);
您不知道现有解决方案还是新解决方案是最好的,因此您应该这样做:
if (minCost[j - weights[i]] + costs[i] < minCost[j]) {
minCost[j] = minCost[j - weights[i]] + costs[i];
// And update the storage of the best solution here.
}
现在要存储最佳解决方案,您只需要知道最后一个最佳选择是什么,然后向后迭代/递归以重建解决方案。
例如,在上面的代码中,您知道您的最佳解决方案包括第 i 项。因此,您可以使用以下代码简单地更新您的最佳解决方案:
solutions[j] = i;
然后,当您完成后,您可以随时重构您的解决方案,知道它是基于 solutions[j - weights[solutions[j]]]
构建的,重复此回溯直到 -1 == solutions[j]
。
综合起来,我们得到:
while (-1 != solution[W]) {
// This prints the last item picked and its corresponding weight.
print solution[W] + ": " + weight[solution[W]]
// This updates the total weight to refer to the
// optimal sub-solution that we built upon.
W = W - weight[solution[W]]
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。