01揹包(動態規劃(回溯))

2021-10-04 01:56:35 字數 1095 閱讀 4350

#include

/*所謂動態規劃,就是分治策略加上不同的區域之間相互影響,

如何從區域性最優解,到全域性最優解,這便是我們所關注的重點,因為還是分割成一塊一塊的,

遞迴入手更好去理解。//

現有n件物品,其中第i件物品的重量為w[i],價值為v[i],

有一容量為j的揹包,求在不超過揹包容量的情況下,使取得的商品的價值總和最大。

注意:物品只有兩種狀態0不放,1放入,沒有所謂狗屁0.5,物品不可分割,無視體積,只看重量。

*/int max(int a,int b)

//未進行優化01揹包問題,裡面有很多重複計算。

int knapsack_value1(int i,int j,int *w,int *v,int n)

else

else}}

//進行過優化,消除重複計算,並且列印出計算結果

int knapsack_value2(int i,int j,int *w,int *v,int n,int arr[11])

//消除重複計算

else if(arr[i][j] > 0)return arr[i][j];

else

else

}return arr[i][j];

}//檢視陣列

void show_arr(int arr[11])

printf(」\n");}}

//列印出最優的選擇

void show_wp(int arr[11],int *w)

++i;

}if(w[i] <= j) printf(」%d 「,i);//最後乙個物品,通過與剩餘容量的比較來確定是否被放入

printf(」\n");

}int main()

;int v = ;

int n = sizeof(w)/sizeof(w[0]);

//申請乙個二維陣列用來消除,重複計算。

int arr[6][11] = ;

printf("%d\n",knapsack_value2(1,10,w,v,n-1,arr));

show_arr(arr);

show_wp(arr,w);

}

動態規劃 回溯法實現0 1揹包

v i,j 表示在前i 1 i n 個物品中能夠裝入容量為j 1 j c 的揹包中的物品的最大值 v i,0 v 0,j 0 式1 式2 式1表明 把前面i個物品裝入容量為0的揹包和把0個物品裝入容量為j的揹包,得到的價值均為0 式2的第乙個式子表明 如果第i個物品的重量大於揹包的容量,則物品i不能...

0 1揹包問題 動態規劃 回溯 分支限界法對比

2017.12.19 20 42 02 字數 3713 閱讀 2820 假定n個商品重量分別為w0,w1,wn 1,價值分別為p0,p1,pn 1,揹包載重量為m。怎樣選擇商品組合,使得價值最高?最大值的估算法 跟分支限界法本質上是一樣的 向上回溯的方法 w cur 表示當前正在搜尋的部分解中轉入的...

0 1揹包C (回溯 動態規劃)

給定n n 100 種物品和乙個揹包。物品i的重量是wi,價值為vi,揹包的容量為c c 1000 問 應如何選擇裝入揹包中的物品,使得裝入揹包中物品的總價值最大?在選擇裝入揹包的物品時,對每種物品i只有兩個選擇 裝入或不裝入。不能將物品i裝入多次,也不能只裝入部分物品i。共有n 1行輸入 第一行為...