回溯法解0 1揹包問題(王曉東演算法例題)

2021-07-03 02:50:01 字數 722 閱讀 2630

給定n

種物品和一揹包。物品

i的重量是

wi,其價值為

vi,揹包的容量為

c。問應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?

整個解的空間相當於乙個二叉樹,左邊是0,代表不取這個物品,右邊是1,代表取這個物品,然後進行dfs,回溯的時候修改。

注意,這裡應該有兩個剪枝,我這裡只寫了乙個。

#include#include#includeusing namespace std;

int n,totcap,bestval;//物品的個數,揹包的容量,最大價值

const int n=1000;

int val[n],w[n],x[n],bestx[n];//物品的價值,物品的重量,x[i]暫存物品的選中情況,物品的選中情況

void dfs(int i,int cv,int cw)

}else

for(int j=0;j<=1;j++)

}}int main()

{ int i;

bestval=0;

cout<<"請輸入揹包最大容量:"<>totcap;

cout<<"請輸入物品個數:"<>n;

cout<<"請依次輸入物品的重量:"<>w[i];

cout<<"請依次輸入物品的價值:"<>val[i];

dfs(1,0,0);

cout<<"最大價值為:"<

回溯法解0 1揹包問題(王曉東演算法例題)

給定n種物品和一揹包。物品i的重量是wi,其價值為vi,揹包的容量為c。問應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?整個解的空間相當於乙個二叉樹,左邊是0,代表不取這個物品,右邊是1,代表取這個物品,然後進行dfs,回溯的時候修改。注意,這裡應該有兩個剪枝,我這裡只寫了乙個。incl...

回溯法解01揹包問題

關於回溯法的概念,這篇文章講的比較通俗易懂 package com.zxg.algorithm.backtrack 回溯法解01揹包問題 揹包問題的概念不再贅述。這裡主要講解下回溯法思路。將每乙個物品分為裝載和不裝載兩條路徑,乙個接乙個的遍歷,每遍歷乙個物品就會產生兩條分支 那麼就會組成一棵樹,深度...

演算法 回溯法 0 1揹包問題

fishing pan 回溯法是一種非常有效的方法,有 通用的解題法 之稱。它有點像窮舉法,但是更帶有跳躍性和系統性,他可以系統性的搜尋乙個問題的所有的解和任一解。回溯法採用的是深度優先策略。回溯法解決問題一般分為三個步驟 1 針對所給問題,定義問題的解空間 2 確定易於搜尋的解空間結構 3 以深度...