回溯法解決01揹包問題

2021-08-14 16:40:04 字數 1430 閱讀 3216

一、問題描述:有n 個物品,它們有各自的重量和價值,現有給定容量的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?

二、總體思路:因為回溯求解的規則是「後進先出」,所以要用棧來存放符合條件的解,在儲存過程中用陣列來存放各個物品的體積和價值,然後用深度優先搜尋的方式求解,最後得到符合條件的最優解並輸出。

三、c語言**如下:

#include

int bc,n; //bc為揹包容量,n為商品數量

int w[10],v[10]; //w陣列存放對應商品的重量,v陣列存放對應商品的價值

int cbv; //當前最優價值

int bv; //最優價值

int cw; //點前重量

int ba[10]; //最優解商品的取法

int cba[10]; //當前最優解商品的取法

void backtracking(int i);

int main()

printf("請輸入揹包的總容量:\n");

scanf("%d",&bc);

//初始化

cbv=0;

bv=0;

cw=0;

for(i=1;i<=n;i++)

//輸出商品價值重量**

printf("商品對應的重量與價值:\n ");

for(i=1;i<=n;i++)

printf("%d ",i);

printf("\n");

printf("重量: ");

for(i=1;i<=n;i++)

printf("%d ",w[i]);

printf("\n");

printf("價值: ");

for(i=1;i<=n;i++)

printf("%d ",v[i]);

printf("\n");

//尋找最優解

backtracking(1);

//輸出最優解

printf("**************************************\n");

for(i=1;i<=n;i++)

printf("最優解為%d\n",bv);

}void backtracking(int i)

return;

}if(w[i]+cw<=bc)

cba[i]=0; //回溯前清理現場

backtracking(i+1);

}

四、執行結果如下:

五、分析

回溯法的重點是在於搞清楚界限函式和什麼時候遞迴,以及回溯的具體時間和位置,搞清楚了這些之後**的編寫還是很簡單的,主要是要搞清楚回溯法的原理和思想。

回溯法解決0 1揹包問題

1.回溯法可以看作是窮舉法的一種實現方式 2.基本過程 每一步只生成解的一部分 部分解 並立即對該部分解進行評估,若有可能擴充套件成為 所求解 則繼續擴充套件,得到新的部分解,泛指嘗試其他部分解,知道窮盡所有可能.3.解空間 所有的可能的解的集合 解空間樹 將解空間組織成樹形成的樹形結構 常見的解空...

回溯法解決0 1揹包問題

問題描述 有n件物品和乙個容量為 c的揹包。第 i件物品的價值是 v i 重量是 w i 求解將哪些物品裝入揹包可使價值總和最大。所謂01揹包,表示每乙個物品只有乙個,要麼裝入,要麼不裝入。回溯法 01揹包屬於找最優解問題,用回溯法需要構造解的子集樹。在搜尋狀態空間樹時,只要左子節點是可乙個可行結點...

回溯法解決0 1揹包問題

0 1揹包問題指的是有乙個能裝w重的揹包,和n個不同重量的物體,如何選擇物體才能盡可能地裝滿揹包。public int maxw integer.min value 儲存揹包中物品總重量的最大值 cw表示當前已經裝進去的物品的重量和 i表示考察到哪個物品了 w揹包重量 items表示每個物品的重量 ...