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

2021-10-12 16:31:22 字數 1790 閱讀 6444

編寫乙個程式,輸出2~10000之間的所有完全數。所謂完全數,是指這樣的數,該數的各因子(除該數本身外)之和正好等於該數本身,例如:

6=1+2+3

28=1+2+4+7+14

#include

using

namespace std;

intmain()

if(m == s)

cout << s <<

" ";}

}

問題描述:對於給定的正整數n(n≥1),求1~n構成的集合的所有子集(冪集)。

冪集(power set):原集合中所有的子集(包括全集和空集)構成的集族

例如:n為3時,集合為:

所有的子集為:{}, , , , , , ,

1、兩個陣列,乙個資料初始化為1到n,另乙個陣列初始化為1到n

2、set方法,輸出2n個子集,也就是說共進行2n次迴圈,每次迴圈裡再遍歷陣列,如果b[i]等於1,則a[i]輸出(存在於要輸出的子集),

3、2n次迴圈中最後要讓b陣列進行一次改變,相當於2進製數+1

#include

using

namespace std;

int num =0;

void

inc(

int b,

int n)

else}}

void

set(

int a,

int b,

int n)

} cout <<

"}";

inc(b, n)

;//二進位制+1}}

void

main()

b[i]=0

;//b的初始化為

}set

(a, b, n)

;}

有n個重量分別為的物品,它們的價值分別為,給定乙個容量為w的揹包。

設計從這些物品中選取一部分物品放入該揹包的方案,每個物品要麼選中要麼不選中,要求選中的物品不僅能夠放到揹包中,使得裝入揹包中物品的總價值最大。

#include

using

namespace std;

void

inc(

int b,

int n)

else}}

void

set(

int a,

int b,

int n,

int w,

int v,

int w)

} cout <<

"}\t\t"

<< sumw <<

"\t"

<< sumv <<

"\t";if

(sumw <= w)

}else

inc(b, n);}

cout <<

"最佳方案為:序號"

<< maxi <<

",總重量:"

<< maxsumw <<

",總價值:"

<< maxsumv;

}void

main()

, v=

;int a[

100]

, b[

100]

;for

(int i =

0; i < n; i++

) b[i]=0

;//初始化b

}set

(a, b, n, w, v, w)

;}

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

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

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

蠻力法是一種簡單直接解決問題的方法,常常直接基於問題的描述,所以蠻力法也是最容易應用的方法。蠻力法所依賴 的基本技術是遍歷,即採用一定的策略依次處理待求解問題的所有元素,從而找出問題的解。由於其需要依次窮舉待處理的元素,因此蠻力法是一種典型的指數級時間演算法。給定n個重量為 價值為的物品和乙個容量為...

演算法設計與分析學習 蠻力法

參考 演算法設計與分析 第三章 蠻力法 接下來的每章中,我們專注於一種特定的演算法設計策略。蠻力法是一種最簡單和直接的解決問題的辦法,往往是低效的,但我們不應該忽略它的地位,1 它可以解決廣闊領域的各種問題 2 在規模允許時,多少可以產生一些實用的演算法 3 往往可以以蠻力法為準繩,來衡量高效的演算...