/* 最优装载问题: 有 n 个集装箱,重量分别为 w[0], ..., w[n - 1] 和一个载重量为 capacity 的货船,现在要把货船尽可能的装满. */ #include<iostream> #include<vector> #include<algorithm> using namespace std; class maxLoading { private: size_t n; //貨物个数 size_t capacity; //貨船的載重量 std::vector<size_t> weight; size_t bestW; size_t currentW; std::vector<size_t> bestPlan; std::vector<size_t> currentPlan; public: template<class Iter> maxLoading(Iter beg, Iter end, size_t _capacity): n(end - beg), capacity(_capacity), bestW(0), currentW(0), weight(beg, end), bestPlan(end - beg, 0), currentPlan(end - beg, 0) { backtrack(0); } void output() { cout << "最优装载重量:" << bestW << '\n'; cout << "装载货物:" << '\n'; for(int i = 0; i < n; ++i) if(bestPlan[i] == 1) cout << i << ','; cout << endl; } private: void backtrack(size_t i) { if(i == n) { if(bestW < currentW) { bestW = currentW; bestPlan = currentPlan; } } else { //搜索左子树 if(currentW + weight[i] <= capacity) { currentPlan[i] = 1; currentW += weight[i]; backtrack(i + 1); currentPlan[i] = 0; currentW -= weight[i]; } backtrack(i + 1); } } }; int main() { int a[] = {10, 40, 40}; maxLoading m(a + 0, a + 3, 80); m.output(); }