有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...