分支限界法處理0 1揹包問題

2021-09-23 23:58:18 字數 1504 閱讀 6937

問題描述:有4個物品,其重量分別為(4,7,5,3),價值分別為(40,42,25,12),揹包容量為w=13。已知每個物品不可再分割,如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大。使用分支限界法求解該問題

sort(res.begin(), res.end(), (res* & a, res* & b) ); //優先排序

bags start;

int up = w * res.front()->value / res.front()->weight, down = 0;

for (int i = 0, w = w; i < res.size(); i++)

} start.ub = up; start.nweigt = w;

int size, count = 0;

queueq;

q.push(start);

while (!q.empty()&&countweight >= 0)

right.ub = right.nvalue + (count + 1 < res.size() ? right.nweigt * (res[count + 1]->value / res[count + 1]->weight) : 0); //修改右結點

if (right.ub > down)

q.push(right);

else

result.push_back(right);

q.pop();

} count++;

} bags* minbag = nullptr;

for (int i = 0; i < result.size(); i++)

for (auto& it : minbag->bags)

it->used = true;

cout << "分支限界法求得最大價值為:" << minbag->nvalue << endl;

for (int i = 0; i < res.size(); i++)

cout << "物品" << i + 1 << "是否被選:" << thing[i].used << endl;

return 0;

}

0 1揹包問題 分支限界法

0 1揹包問題可描述為 n個物體和乙個揹包。對物體i,其價值為value,重量為weight,揹包的容量為w 如何選取物品裝入揹包,使揹包中所裝入的物品總價值最大?2.1 用到的資料結構 class goods 定義貨物資料型別 class knapsack 揹包 2.2 演算法步驟1 定 空間。x...

分支限界法 0 1揹包問題

分支限界法類似於回溯法,也是在問題的解空間上搜尋問題解的演算法。一般情況下,分支限界法與回溯法的求解目標不同。回溯法的求解目標是找出解空間中滿足約束條件的所有解,而分支限界法的求解目標則是找出滿足約束條件的乙個解,或是在滿足約束條件的解中找出使某一目標函式值達到極大或極小的解,即在某種意義下的最優解...

0 1揹包問題(分支限界法)

需求分析 0.問題描述 給定一揹包的容量c,和n個物品的重量wi價值vi,求在揹包容量允許的條件下能裝入的最大價值 1.問題分析 解空間 子集樹,第i層每個節點有兩棵子樹 選擇物品i,不選擇物品i 優先佇列的優先順序如何確定?每個節點的祖先節點都已經確定,那麼可以得到已經裝入揹包的物品的價值,加上剩...