演算法分析與設計 蠻力法0 1揹包

2021-10-10 17:38:19 字數 2159 閱讀 9173

蠻力法是一種簡單直接解決問題的方法,常常直接基於問題的描述,所以蠻力法也是最容易應用的方法。

蠻力法所依賴 的基本技術是遍歷,即採用一定的策略依次處理待求解問題的所有元素,從而找出問題的解。由於其需要依次窮舉待處理的元素,因此蠻力法是一種典型的指數級時間演算法。

給定n個重量為、價值為的物品和乙個容量為c的揹包,0/1揹包是乙個求解這些物品中的乙個最有價值的子集,並且能夠裝入到揹包中。

有n項可投資的專案,每個專案需要投入資金si,可獲利潤為vi,現有可用資金m,應選擇那些專案來投資才能獲得最大利潤。

用蠻力法解決0/1揹包問題,需要考慮給定n個物品集合的所有子集,找出所有重量不超過揹包容量的子集,計算每個可能子集的總價值,然後找到價值最大的子集。例如,給定4個物品的重量為,價值為,和乙個容量為10的揹包,下表為求解的過程。

序號子集

總重量總價值1∅

0027

423312

44405

525610

54711不可行812

不可行9752

1083711965

1214

不可行13

15不可行

1416

不可行15

12不可行

1619

不可行輸入:重量,價值,容量c

輸出:裝入揹包的物品編號

初始化最大價值maxvalue=0;結果子集s=∅;

對集合的每乙個子集t,執行如下操作:

2.1 初始化揹包的價值value=0;揹包的重量weight=0;

2.2 對子集t的每乙個元素j

2.2.1 如果weight+wj<c,則weight=weight+wj;value=value+vj;

2.2.2 否則,轉入步驟2考察下乙個子集;

2.3 如果maxvalue<value,則maxvalue=value;s=t;

輸出s中的各元素;

#include

#include

#include

//用於計算程式運算時間

#include

using

namespace std;

#define n 100

struct goods

;int n, maxvalue, cv, cw, c;

//物品數量,價值最大,當前價值,當前重量,揹包容量

int x[n]

,cx[n]

;//最終儲存狀態,當前儲存狀態

struct goods goods[n]

;int

force

(int i)

return maxvalue;

} cw = cw + goods[i]

.wight;

cv = cv + goods[i]

.value;

cx[i]=1

;//裝入揹包

force

(i+1);

cw = cw-goods[i]

.wight;

cv = cv-goods[i]

.value;

cx[i]=0

;//不裝入揹包

force

(i+1);

return maxvalue;

}int

main()

int sum1 =

force(0

);printf

("蠻力法求解0/1揹包問題:\nx=[");

for(

int i =

0; i < n; i++

)printf

("] 裝入總價值%d\n"

,sum1)

; finish=

clock()

; time =

(double

)(finish-starttime)

/1000

;//時間單位為秒

starttime=

clock()

;//用於計算程式執行時間

cout<<

"time is:"

}

對於乙個具有n個元素的集合,其子集數量是2n,所以無論生成子集的演算法效率有多高,蠻力法求解0/1揹包都會是乙個ω(2n)的演算法。

演算法設計與分析 蠻力法求解0 1揹包問題

由於最近在複習演算法設計與分析,所以就想試著完成一下書上的 描述 揹包問題 給定重量分別為,價值分別為的n件物品,和乙個承重為w的揹包。求這些物品中乙個最有價值的子集,並能裝到揹包中。揹包問題的蠻力解法是窮舉這些物品的所有子集,找出能夠裝到揹包中的所有子集,並在這些子集中找出價值最大的子集 實驗資料...

演算法分析與設計(四 蠻力法求解0 1揹包問題)

編寫乙個程式,輸出2 10000之間的所有完全數。所謂完全數,是指這樣的數,該數的各因子 除該數本身外 之和正好等於該數本身,例如 6 1 2 3 28 1 2 4 7 14 include using namespace std intmain if m s cout s 問題描述 對於給定的正整...

0 1揹包問題(蠻力法)

用蠻力法解決0 1揹包問題 例子輸入 4 6 5 43 4 2 31 1輸出 10 6 8 include include using namespace std intmain int w 5 v 5 int max 0 每輪最大價值 int max1 0 最終最大價值 int weight 0 ...