Đây là chương trình nhị phân tương đối đơn giản.
Tôi muốn đề xuất lực lượng vũ phu bằng cách cắt tỉa. Nếu bất cứ lúc nào bạn vượt quá trọng lượng cho phép, bạn không cần phải thử kết hợp các mục bổ sung, bạn có thể loại bỏ toàn bộ cây.
Ồ, chờ đợi, bạn có âm lượng trọng lượng? Bao gồm tất cả các trọng số âm luôn, sau đó tiến hành như trên cho các trọng số tích cực. Hoặc các mục trọng lượng âm cũng có giá trị âm?
Bao gồm tất cả các mục trọng lượng âm với giá trị dương. Loại trừ tất cả các mục có trọng số dương và giá trị âm.
Đối với các mục trọng lượng âm có giá trị âm, trừ trọng lượng của chúng (tăng độ rộng ba lô) và sử dụng mục giả đại diện cho không lấy mục đó. Các pseudo-item sẽ có trọng lượng và giá trị tích cực. Tiến hành bằng vũ lực bằng cách cắt tỉa.
class Knapsack
{
double bestValue;
bool[] bestItems;
double[] itemValues;
double[] itemWeights;
double weightLimit;
void SolveRecursive(bool[] chosen, int depth, double currentWeight, double currentValue, double remainingValue)
{
if (currentWeight > weightLimit) return;
if (currentValue + remainingValue < bestValue) return;
if (depth == chosen.Length) {
bestValue = currentValue;
System.Array.Copy(chosen, bestItems, chosen.Length);
return;
}
remainingValue -= itemValues[depth];
chosen[depth] = false;
SolveRecursive(chosen, depth+1, currentWeight, currentValue, remainingValue);
chosen[depth] = true;
currentWeight += itemWeights[depth];
currentValue += itemValues[depth];
SolveRecursive(chosen, depth+1, currentWeight, currentValue, remainingValue);
}
public bool[] Solve()
{
var chosen = new bool[itemWeights.Length];
bestItems = new bool[itemWeights.Length];
bestValue = 0.0;
double totalValue = 0.0;
foreach (var v in itemValues) totalValue += v;
SolveRecursive(chosen, 0, 0.0, 0.0, totalValue);
return bestItems;
}
}
Nguồn
2011-11-14 17:20:19
Bạn có thực sự có nghĩa là * có thể giải quyết *, hoặc * có thể giải quyết hiệu quả * không? –
Nếu bạn không cần một câu trả lời chính xác, bạn có thể nhìn vào mô phỏng ủ .. –
2^10 là 1024. Chắc chắn sức mạnh vũ phu nó, ngay cả khi có một "tốt hơn" cách nó gần như chắc chắn sẽ chậm hơn nhiều. –