這段**只是使用暴力法解決了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個 當前...