暴力法求解01揹包問題

2021-08-31 21:52:26 字數 1732 閱讀 9293

這段**只是使用暴力法解決了01揹包問題,但是沒有經過優化,效率不高。

使用暴力法的原因只是因為作業需求,請勿評價。

主要的難點在於使用c語言列出乙個陣列的所有子集。使用了遞迴的方法,將每次的計算都歸併為二個元素,這樣就能夠簡化問題。

//

// main.c

// backpack

//// created by shadowdai on 11-10-25.

//#include //k是開始字元的位置,n是陣列的長度,l是子集的位數

void subarray(int w, int v, int k,int l, int n);

//初始化整個子集陣列

void initarray(int n);

//用於輸出子集的陣列

int priarray[4];

void printarray(int w, int n);

//計算子集的個數

int counter;

int subarrayweight[16];

int subarrayvalue[16];

//計算子集的重量和價值

void sumofweightandvalue(int w, int v, int m, int n);

//尋找重量不超過揹包重量,並且價值最大的子集

int searchmax();

//重量和價值陣列

int main()

; int value[4] = ;

//0是所有陣列的子集

printf("the no.1 is: 0\n");

subarrayweight[0] = 0;

subarrayvalue[0] = 0;

counter = 1;

for (i = 0; i < 4; i++)

printf("\nthere are %d subarray.\n", counter);

for (i = 0; i < 16; i++)

max = searchmax();

printf("\nthe most valuable package is no.%d, the max value is %d.\n", max+1, subarrayvalue[max]);

return 0;}/*

* 該遞迴演算法每次只向後尋找一位數字。

* 例如k=1時,只會尋找2,3,4;k=2時,只會尋找3,4

*/void subarray(int w, int v, int k, int l, int n)

else }

}/* * 列印子集陣列的函式

*/void printarray(int w, int n)

printf("\n");}/*

* 初始化子集陣列

*/void initarray(int n)}/*

* 計算子集的重量和價值綜合

* m是該子集的序號,與counter相同。n是陣列長度

*/void sumofweightandvalue(int w, int v, int m, int n)

subarrayweight[m-1] = sumweight;

subarrayvalue[m-1] = sumvalue;}/*

* 排序並查詢所有子集中最大子集

*/int searchmax()}}

return max;

}

求解0 1揹包問題 蠻力法即暴力演算法實現

求解0 1揹包問題 問題描述 有n個重量分別為的物品,它們的價值分別為,給定乙個容量為w的揹包,實際從這些物品中選取一部分物品放入該揹包的方案,每個物品要麼選中要麼不選中,要求選中的物品不僅能夠放到揹包中,而且要具有最大的價值。問題求解 對於n個物品 容量為w的揹包問題,採用前面求冪集的方法求出所有...

回溯法求解01揹包問題

在前面文章我們使用動態規劃求解了揹包問題,時間複雜度是o cn 當我們的c的值非常大的時候,說消耗的時間也是非常大的!接下來我們就使用回溯法來求解這個問題,其時間複雜度為o n2n 這個結果當我們的c的值是小於2n 的時候,該演算法所需的時間是小於動態規劃的!既然使用了回溯法,我們就的構造解析樹,因...

回溯法求解0 1揹包問題

include using namespace std struct dot void getvalue int weight,int value void calculate int weight,int value else while deep 6 else int main 選擇第1個 當前...