蠻力法是一種簡單直接解決問題的方法,常常直接基於問題的描述,所以蠻力法也是最容易應用的方法。
蠻力法所依賴 的基本技術是遍歷,即採用一定的策略依次處理待求解問題的所有元素,從而找出問題的解。由於其需要依次窮舉待處理的元素,因此蠻力法是一種典型的指數級時間演算法。
給定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 ...