随机生成n个物品的长宽高m种箱子的长宽高要求将这n个物品放入m种箱子中每种箱子有无限多个使得使用的箱子数量最少用启发式算法写出c++代码
下面是使用贪心策略的启发式算法的C++代码实现:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Item {
int length;
int width;
int height;
};
struct Box {
int length;
int width;
int height;
};
bool compareItems(Item a, Item b) {
return max(max(a.length, a.width), a.height) > max(max(b.length, b.width), b.height);
}
bool compareBoxes(Box a, Box b) {
return max(max(a.length, a.width), a.height) > max(max(b.length, b.width), b.height);
}
int packItems(vector<Item>& items, vector<Box>& boxes) {
sort(items.begin(), items.end(), compareItems);
sort(boxes.begin(), boxes.end(), compareBoxes);
int numBoxes = 0;
for (int i = 0; i < items.size(); i++) {
bool itemPacked = false;
for (int j = 0; j < boxes.size(); j++) {
if (items[i].length <= boxes[j].length && items[i].width <= boxes[j].width && items[i].height <= boxes[j].height) {
boxes[j].length -= items[i].length;
boxes[j].width -= items[i].width;
boxes[j].height -= items[i].height;
itemPacked = true;
break;
}
}
if (!itemPacked) {
numBoxes++;
}
}
return numBoxes;
}
int main() {
int n, m;
cout << "Enter the number of items: ";
cin >> n;
cout << "Enter the number of boxes: ";
cin >> m;
vector<Item> items(n);
vector<Box> boxes(m);
cout << "Enter the dimensions of each item:" << endl;
for (int i = 0; i < n; i++) {
cout << "Item " << i + 1 << ": ";
cin >> items[i].length >> items[i].width >> items[i].height;
}
cout << "Enter the dimensions of each box:" << endl;
for (int i = 0; i < m; i++) {
cout << "Box " << i + 1 << ": ";
cin >> boxes[i].length >> boxes[i].width >> boxes[i].height;
}
int numBoxes = packItems(items, boxes);
cout << "Minimum number of boxes required: " << numBoxes << endl;
return 0;
}
该算法首先对物品和箱子按照最大边长进行降序排序,然后依次遍历每个物品,尝试将其放入能容纳的最小箱子中。如果找不到合适的箱子,就增加箱子数量。最后返回所需的箱子数量。
请注意,该算法仅仅是一种启发式算法,不一定能够得到最优解。在实际应用中,可能需要使用其他更复杂的算法来解决这个问题
原文地址: https://www.cveoy.top/t/topic/iooP 著作权归作者所有。请勿转载和采集!