【发布时间】:2016-03-18 14:00:07
【问题描述】:
用户将输入三个对象的重量阈值、对象数量以及重量和成本。 输出应该是背包图并且应该显示最优解。
重量应该最大,成本应该最小。
样本输出:
w=60
n=3
w = 10
w2 = 35
w3 = 30
c=8
c1=4
c2=7
output:
A 10 8
B 35 4
C 30 7
AB 45 12
AC 40 15
BC 65 11
ABC 75 19
OPTIMAL SOLUTION: AB with total weight of 45 and total cost of 12.
我的问题是我的最佳解决方案是错误的。它输出OPTIMAL SOLUTION: A with total weight of 40 and total cost of 15.
我应该如何解决它?
谢谢!
import java.util.*;
public class KnapsackBruteForce {
static int numObject;
static int weightThreshold = 0;
static String variables[] = new String[100];
static double numCombination;
static KnapsackBruteForce knapsack = new KnapsackBruteForce();
static Scanner input = new Scanner(System.in);
public static void main(String args[]){
System.out.print("Enter weight threshold: ");
weightThreshold = input.nextInt();
System.out.print("Enter number of objects: ");
numObject = input.nextInt();
int weightObject[] = new int[numObject+1];
int costObject[] = new int[numObject+1];
System.out.println("Enter variables: ");
for(int i=0;i<numObject;i++){
variables[i] = input.next();
}
for(int i=0;i<numObject;i++){
System.out.print("Enter weight of object "+variables[i]+": ");
weightObject[i] = input.nextInt();
}
for(int i=0;i<numObject;i++){
System.out.print("Enter cost of object "+variables[i]+": ");
costObject[i] = input.nextInt();
}
knapsack.possibleCombinations(variables, weightObject, costObject, weightThreshold, numObject);
}
public void possibleCombinations(String variables[], int weightObject[], int costObject[], int weightThreshold, int numObject){
int weight = 0;
int cost = 0;
int optWeight = 0;
int optCost = 0;
String optVar = "";
String newVar = "";
for (int i = 1; i < (1 << numObject); i++) {
String newVariable = Integer.toBinaryString(i);
for (int j = newVariable.length() - 1, k = numObject - 1; j >= 0; j--, k--) {
if (newVariable.charAt(j) == '1') {
newVar = variables[k];
weight += weightObject[k];
cost += costObject[k];
System.out.print(newVar);
}
}
System.out.println("\t" + weight + "\t" + cost);
if (weight <= weightThreshold) {
if (optWeight == 0 && optCost == 0) {
optWeight = weight;
optCost = cost;
} else if (optWeight <= weight) {
if (optCost <= cost) {
optVar = newVar;
optWeight = weight;
optCost = cost;
}
}
}
weight = 0;
cost = 0;
}
System.out.println("OPTIMAL SOLUTION: " + optVar + " with total weight of " + optWeight + " and total cost of " + optCost + ".");
}
}
【问题讨论】:
-
将信息记录添加到代码中的关键位置,或通过调试器运行它以查看算法在什么时候没有像您认为的那样工作。
标签: java brute-force knapsack-problem