用貪心演算法解決揹包問題

2021-07-07 02:38:55 字數 2058 閱讀 3218



貪心演算法:顧名思義,

貪心演算法

總是能做到當前看來是最好的選擇。也就是說貪心演算法並不從整體最優上加以考慮,它所作出的選擇只是在某種意義上的

區域性最優選擇

。所謂貪心選擇性質是指所求問題的整體最優解可以通過一系列區域性最優的選擇,是貪心演算法與動態規劃演算法的主要區別。

0-1揹包問題

給定n種物品和乙個揹包。物品i的重量是wi,其價值為vi,揹包的容量為w。問應如何選擇物品裝入揹包,使得裝入揹包中的物品的總價值最大?在選擇物品裝入揹包時,對每種物品i只有兩種選擇,要麼裝入,要麼不裝入,不能將物品j裝入揹包多次,也不能只裝入物品 j 的一部分。

假設有三種物品,分別為1,2,3,其重量分別為20,30,60,(單位公斤),1,2,3對應的價值分別是40,90,240。揹包容量為90公斤

物品1每公斤價值40/20=2

物品2每公斤價值是90/30=3

物品3每公斤價值是240/60=4

要使裝入的物品總價值最大,則需要先裝大價值的物品,最後裝最小價值的。所以先裝物品3,把60公斤均裝進揹包,還剩30公斤,把物品2均裝入30公斤,此時包的容量已經裝滿,此時的揹包中的物品的總價值為240+90=330為最大總價值。

揹包問題

與0-1揹包問題類似,所不同的只是在選擇物品i裝入揹包時,可以選擇物品的一部分而不一定要全部,1≤i≤n。

從上面的列子可以理解為,假設選中物品3 ,在0-1揹包問題裡,必須要把物品3的總重量60斤全部放進揹包,而揹包問題,則可以選擇放進少於60斤的物品3,可以不必把60斤全放進揹包。

用貪心演算法解揹包問題的基本步驟是:

首先計算每種物品單位重量的價值vi/wi,然後,依貪心選擇策略,將盡可能多的單位重量價值最高的物品裝入揹包。若將這種物品全部裝入揹包後,揹包內的物品總重量未達到w,則選擇單位重量價值次高的物品並盡可能多地裝入揹包。依此策略一直地進行下去直到揹包滿重為止。演算法的主要計算時間在於將各種物品依其單位重量的價值從大到小排序。因此,演算法的計算時間上界為o(nlogn)。

揹包問題實現**如下:

// beibao.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include

#include

#define maxsize 100 //假設物體總數

#define m 90 //揹包的容量

//演算法核心,貪心演算法

void greedy(float dzw, float x, int sortresult, int n)

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

x[temp] = 1;//若合適則取出

bcaption -= dzw[temp];//揹包容量改變

}if (i <= n)//使揹包充滿

return;

}void sort(float temparray, int sortresult, int n)

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

}if (sortresult[index] == 0)

}//修改效益最低的sortresult[i]標記

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

}return;

}//得到本演算法的所有輸入資訊

void getdata(float djz, float dzw, int *n)

printf("請輸入各物品種類的重量 :\n");

for (i = 0; i < (*n); i++)

return;

}void output(float x, int n)

printf("\n");

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

return;

}int main()

sort(x, sortresult, n);

greedy(dzw, x, sortresult, n);

output(x, n);

system("pause");

}0-1揹包問題,將上面**進行修改,使得最終輸出的只能是0或1 。



貪心演算法解決部分揹包問題

所謂貪心演算法是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,所做出的僅是在某種意義上的區域性最優解。貪心演算法不是對所有問題都能得到整體最優解,但對範圍相當廣泛的許多問題他能產生整體最優解或者是整體最優解的近似解。貪心演算法的基本思路如下 1.建立數學模型來...

貪心演算法解決部分揹包問題

給定乙個最大容量為m的揹包和n種物品,有食鹽 白糖 大公尺等。已知第i種食品最多有wi公斤,其價值為vi元 公斤,請確定乙個裝貨方案,使得裝入揹包中的所有食品的總價值最大。考慮到物品可以分塊進行裝載,即每乙個物品按重量可分割,所以採用單位價值大的先裝滿的原則進行貪心,如下 include inclu...

揹包問題(貪心演算法)

揹包問題 程式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...