揹包演算法解決一道華為面試題

2021-07-04 08:16:27 字數 1170 閱讀 1391

有兩個陣列a,b,大小都為n,陣列元素的值任意,無序;

要求:通過交換a,b中的元素,使陣列a元素的和與陣列b元素的和之間的差最小

**是這個。

估計多數人想到的都是先sort,再交叉,或者一條龍什麼的,包括我。後來一想不對啊,如果前面的都是個位數,最後乙個是999怎麼辦?

抱著學習的態度一頁一頁往下翻,好多人都是在提出來自己想法,但是我拿我這個999驗證一下,都不對!(⊙﹏⊙)b 汗!!後來我自己也想了好久,八分鐘肯定是有了,不過接著就想到了揹包演算法。

先把最重的放進a,次重的放b,此時一定是sum(a) >sum(b),再把第三個放進b裡,如果這時候sum(a) < sum(b),第四個放a裡面,否則放b裡。以此類推,誰輕就先放誰,值到有乙個先充滿了10,再把剩下的放入到另乙個中去。演算法應該不算是最優的,我清楚的很,不過起碼靠譜多了。**如下,我寫的**那就更沒法看了

#include#include#include #include #include #include #include #include #include void getarray( int *c ) 

}void insertc( const int a, std::vector&c , int right )

//從大到小

int mid = 0;

right = right - 1;

while (left <= right)

else

}c.insert(c.begin() +left, 1, a);

return;

}void insertab( int *a, int *b, std::vector& c )

else

if(aindex == 10)

std::cout<

//隨機取值

getarray(a);

getarray(b);

int right = 0;

//sort

for (int i = 0; i < 10; i++)

for (int i = 0; i < 10; i++)

//分別插入

insertab(a, b, c);

for (int i = 0; i < 10; i++)

{ std::cout<

華為的一道面試題

通過鍵盤輸入一串小寫字母 a z 組成的字串。請編寫乙個字串壓縮程式,將字串中連續出席的重複字母進行壓縮,並輸出壓縮後的字串。壓縮規則 1 僅壓縮連續重複出現的字元。比如字串 abcbc 由於無連續重複字元,壓縮後的字串還是 abcbc 2 壓縮欄位的格式為 字元重複的次數 字元 例如 字串 yyy...

一道面試題

一道面試題 射擊運動員10發打中90環有多少種可能,請編寫程式計算出來,並列印出結果,0環和10環均有效。打中90環就是沒打中10環,所以打中90環跟打中10環的可能性是一樣的。然後開始遞迴狂打槍,一到10就記錄 if params i 10 在迴圈的控制中已經排除了大於10的可能性 i 10 pa...

一道面試題

前些時候在找工作,就在準備結束此次找工作歷程的時候,去了一家公司面試,去了之後技術經理直接帶到一台電腦旁,給了一張紙條,上面是這樣的題目 用c或c 來實現 1 建立一棵樹,該樹的深度是隨機的,每個節點的位元組點數是隨機的。2 給每個節點分配一段隨機大小的記憶體空間,給每個節點賦乙個隨機數。3 遍歷這...