0 1揹包入門

2021-09-26 03:14:06 字數 1937 閱讀 5855

有n個重量分別為w1 、 w2 、w3、w4···wn的物品,編號1~n,它們的價值為v1 、 v2 、v3、v4···vn。現有一容量為w的揹包,求盡可能的把揹包裝滿並使價值最大

下面不妨以n=4 w=6為例

物品編號

重量價值15

4234

3234

11

思路大概是用蠻力法找出n的所有冪集,然後遍歷一遍,找到最優解

複雜度為o(2n)

#include

#include

#include

#include

#include

using namespace std;

/** 求解簡單0/1揹包問題

2019-8-12

*/vectorint>

> ps;

void

pset

(int n)

// 求1-n的冪集

}void

knap

(int w,

int v,

int w)

printf

("}\t\t%d\t%d "

,sumw,sumv);if

(sumw<=w)

}else cout <<

"否\n"

;// count++;

}printf

("最佳方案為:");

printf

("選中物品");

printf

(",");

printf

("總重量:%d,總價值:%d\n"

,maxsumw,maxsumv);}

intmain()

;int v=

;pset

(n);

printf

("0/1揹包解決方案\n"

,n);

knap

(w,v,w)

;return0;

}

#include

#include

using namespace std;

#define maxv 20

int maxv =

-9999

;int bestx[20]

;// 存放最優解,全域性變數

int total =1;

struct nodetype

;int n =

5,w =6;

int w=

;int v=

;void

bound

(nodetype &e)

if(i<=n)

e.ub = sumv+

(w-sumw)

*v[i]

/w[i]

;else e.ub = sumv;

}void

enqueue

(nodetype e,queue

&qu)

}else qu.

push

(e);

}void

bfs()

e2.num = total++

; e2.i = e.i+1;

e2.w = e.w;

e2.v = e.v;

for(j=

2;j<=n;j++

) e2.x[j]

= e.x[j]

; e2.x[e2.i]=0

;bound

(e2);if

(e2.ub>maxv)

enqueue

(e2,qu);}

}int

main()

未完待續~~

參考: 李春葆 .演算法設計與分析(第二版)

01揹包入門

01揹包問題模型 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。這是最基礎的揹包問題,特點是 每種物品僅有一件,可以選擇放或不放。用子問題定義狀態 即f i v 表示前i件物品恰放入乙個容量為v的揹包可以獲得的最大價值。則其狀態轉移方...

01揹包入門

description 乙個旅行者有乙個最多能裝m公斤的揹包,現有n件物品,它們的重量分別是w1,w2,w3,wn,它們的價值分別為c1,c2,c3,cn。若每種物品只有一件,求旅行者能獲得的最大總價值。input m,和n m 200,n 30 接下來共n行每行兩個整數wi,ci output 最...

01揹包 DP入門

n個重量和價值分別為w,v的物品。找出總重量不超過w 的物品,求所有挑選方案中價值總和的最大值。n 4 w,v w 5 輸出 7 選0號,1號,3號 理解 n個物品 揹包容量w int w max n v max n weight,value 暴搜 o 2 n int rec int i,int j...