揹包問題(貪心演算法)

2021-10-07 06:03:02 字數 2787 閱讀 3239

注意:這是揹包問題,而不是0-1揹包問題,揹包問題可以用貪心演算法進行求解,但0-1無法用貪心演算法求解,需要用動態規劃演算法求解;

首先對貪心演算法做一下總結,以及它與動態規劃演算法的區別:

貪心演算法兩個最重要的性質:

(1)貪心選擇性質;

(2)最優子結構性質;

其中,貪心選擇性質:自頂向下進行決策,每次做出的決策都是區域性最優解,且每次做出決策後問題規模都變小了;最優子結構性質:即問題的最優解結構中包含子問題的最優解;

動態規劃演算法的兩個最重要的性質:

(1)重疊子問題性質;

(2)最優子結構性質;

其中最優解子結構性質和貪心演算法相似,唯一不同的是重疊子問題性質,因為動態規劃演算法是自底向上的演算法,它需要首先將原始問題分解為若干個相互有聯絡的子問題,在計算的時候有的子問題可能會被計算很多次,所以動態規劃演算法會將這些子問題的解存在乙個**中,使得最終對於這些子問題只需要求解一次(可以使原來需要再指數時間內解決的問題可以在多項式問題中得到解決)

揹包問題求解**如下:

(其中使用的排序演算法基於合併排序演算法)

#ifndef merge_sort_h

#define merge_sort_h

template <

class

type

>

void mergesort(type a,

int n)

;#endif

//merge_sort.template實現部分

#include "merge_sort.h"

template <

class

type

>

void mergesort(type *a , type *v,

int n)

//a是重量,v是價值

delete b;

}template <

class

type

>

void mergepass(type *x, type *y, type *v,

int s,

int n)

if(i + s < n)

//剩下的元素少於2s

merge(x, y, v, i, i + s -

1, n -1)

;else

for(

int j = i; j <= n -

1; j++)

y[j]

= x[j];}

template <

class

type

>

void merge(type *c, type *d, type *v ,

int l,

int m,

int r)

//合併c[l:m]和c[m+

1:r]到d[l:r]

,其中c[l:m]和c[m+

1:r]都是已經經過公升序排好的陣列

if(i > m)

for(

int q = j; q <= r; q++)

d[k++]

= c[q]

;else

for(

int q = i; q <= m; q++)

d[k++]

= c[q]

;}

//揹包問題,使用貪心演算法進行求解

//===

====

====

====

====

====

====

====

====

====

====

====

*****==

#include

#include "merge_sort.cpp"

using namespace std;

void init_data(

float

*v,float

*w,float

*x,int n)

//初始化資料

cout <<

"請輸入每類物體的重量: "

<< endl;

for(

int i =

0; i < n; i++)

for(

int i =

0; i < n; i++)

x[i]=0

;}void knapsack(

int n,

float m,

float

*v,float

*w,float

*x)//n是物體的種類數,m是揹包容量,v是每類物體的價值,w是每類物體的重量,x是每類物體裝入的份額,屬於[0,

1]if(i < n)

x[i]

= c / w[i];}

int main(void)

cout <<

"\n\n輸出最後的決策x[i] : "

<< endl;

for(

int i =

0; i < n; i++)

/*mergesort(w, v, n)

; cout <<

"輸出排好序的w[i] : "

<< endl;

for(

int i =

0; i < n; i++)

*/system(

"pause");

delete v , w , x;

return0;

}

揹包問題(貪心演算法)

揹包問題 程式8 4 2.cpp 定義控制台應用程式的入口點。揹包問題 貪心演算法 include stdafx.h define maxnumber 20 typedef struct node object float find object wp,int n,float m i 0 while...

貪心演算法 揹包問題

詳細見原帖 我寫的是自己的感悟 揹包問題 有乙個揹包,揹包容量是m 150。有7個物品,物品可以分割成任意大小。要求盡可能讓裝入揹包中的物品總價值最大,但不能超過總容量。物品 a b c d e f g 重量 35 30 60 50 40 10 25 價值 10 40 30 50 35 40 30 ...

貪心演算法 揹包問題

貪心演算法 當前最優解 例如在刪除數的乙個例子中,乙個長度不大於240位的整數中,隨機刪除n個數,要求使得剩餘的數 從左到右的,組成乙個最小的整數 貪心步驟 例如 乙個數 1457326 n 4 1 找到當前最大的數 7 刪除 145326 2 找到當前最大的數 6 刪除 14532 3 找到當前最...