最新的乙個面試的演算法題目 乙個完全揹包問題

2021-06-18 00:31:07 字數 1847 閱讀 5193

乙個集合x有都不相同的n個元素,使用這個集合中的不定個數的元素,組成乙個和為s的序列,求出所有符合的序列,元素可以重複使用,只要元素的個數相同不考慮順序。

比如集合是x=; n=5, s=12可以得出以下的序列:

2 2 2 2 2 2

2 2 2 3 3

3 3 3 3

2 2 2 2 4

2 3 3 4

2 2 4 4

4 4 4

2 2 3 5

3 4 5

2 5 5

2 3 7

5 7解題思路:

元素存在arr陣列中,大小為size。

path[i][j]表示陣列前i個元素(乙個元素可出現多次),組成重量恰好為j裝入揹包的可能,如可能則為true,否則為false。得到遞推關係:                

path[i][j]=true,if path[i][j-arr[i]]=true的話;否則為false。

邊界條件path[i][0]=true(i為1...size),為了避免遍歷,在程式中使用

hashtable陣列,如果可以通過前面的元素組成容量為j的揹包,則hashtable[j]=true,否則為false。01

2345

6789

1011121

tftt

tftf

tftf

t2tf

ftft

tttt

ttt3

tfff

tftt

tttt

t4tf

ffft

fttt

ttt5

tfff

ffft

tttt

t求出path陣列後,通過printpath(int i,int j,int c)函式列印出所有的路徑。printpath(int i,int j,int c)是個遞迴函式,表示列印出所有第i個元素和前i-1個元素組成容量為j的揹包的路徑,函式遞迴過程中使用v佇列儲存過程中的元素,其中c為v佇列的大小。如printpath(2,12,0)將arr[2]=3加入佇列,然後呼叫printpath(2,9,1)將3入隊,然後分兩路,一路如藍字所示,呼叫printpath(1,6,2)將2入隊,...,佇列中元素為3,3,2,2,2,逆序列印;一路如淺紅色所示,呼叫printpath(2,6,2)將3入隊,...,佇列中元素3,3,3,3,逆序列印。呼叫遞迴函式請讀者仔細體會。

#include #include #include #include #include #define _debug 1

#define maxm 20

#define maxn 10

int arr[maxn];//數陣列

bool path[maxn][maxm+1];//路線

bool hashtable[maxm+1];//是否存在

int c;//記錄列印佇列大小

int v[maxm+1];//列印佇列,陣列大小最大為maxn+1,此時每個數為1

void printpath(int i,int j,int c)

printf("%d\n",v[0]);

return;

} assert(path[i][j]);

v[c++]=arr[i];//將元素加入到列印佇列中

for(int k=1;k<=i;k++)

c--;//將元素從列印佇列中刪除

}void solve(int size,int m)

} }for(i=1;i<=size;i++) }}

int main()

solve(n,m);

return 0;

}

乙個有趣的題目

看到qq群裡有人發了乙個很有意思的題目 如果 昨天是明天就好了,那麼今天就是周五了,請問句中的今天是週幾?晚上睡覺的時候又想起這個問題,發現這個問題還大有文章,其實問題的關鍵在於上面的綠色背景的如果兩個字,既然是如果,那麼思維就可以完全發散,如果時間可以穿越,明天真的可以穿越到昨天,那麼今天其實就是...

乙個c 題目

被人問了c 的乙個題目,簡直長知識哇 includeusing namespace std int i 1 class mycls void echo 這個 是建構函式,括號裡面是他們的初值,然後 初始化的順序是根據定義的次序也就是 private int m nfri int m nsec int...

乙個概率題目

1.題目 來自北郵論壇上的乙個題目。4個男人和一些女人一起被關在乙個屋子裡,然後又關進去一人,然後隨機的取出一人,發現取出來的人是男人,問最後關進去的那個人是男人的概率。假設男女比例很和諧,為1 1 tips 是一些女人,不是乙個女人,也就是女人的個數是未知的 2.思路 男女比例1 1這說明,p 放...