網易筆試 動態規劃

2021-07-30 01:16:22 字數 842 閱讀 8225

題目雖然不難,但是初看也沒用多少思路,後來看了別人的**,雖然 **很短,只有簡單幾行**,但是也看了好一會兒才明白,動態規劃真的很有用。

貼上題目的鏈結,網易實習生的第一道程式設計題,最難的部分是動態規劃部分,**如下:

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

for(int j = sum/2 ; j >= arr[i] ; --j)

dp[j] = max(dp[j],dp[j-arr[i]]+arr[i]);//dp[j]表示在容量為j的情況可存放的重量

printf("%d\n",(sum-dp[sum/2])*1024);

主要不明白在max那一句,其實那一句表示,比較當前放入第i個數後,j表示當前包的最大容量,最後我們輸出的其實還是dp[sum/2]時候的值,但是在動態規劃一步步求解時會遇到過程。

此測試用例,輸入資料的集合為【3,3,7,3,1】,對於第乙個資料3,dp的取值為dp[3]-dp[8],即表示包最小的容量是從arr[3]開始的,最大到包最大容量,當然因為當前只有乙個數,所以不論包的大小是多少,存放的最大容量都為3.

當第二個資料3來時,即需要判斷在規定包的大小放當前兩個資料時最大容量是多少,當j為8時,那就是說包的最大容量為8,那麼存放第二個資料要在前一步當容量是5時候的最優值,在包大小是5的基礎上存放當前資料一定是最優的,同理當j減去1,即包的大小是7時,那麼最優的肯定是在前一步包的大小是4的基礎上加上,最後在與放入該數之前的dp值求誰更大些,所有的數字都進行此操作。

所以說每一次執行完的dp值其實都表示前i個數字當前包容量時候存放的最大值,當執行完最後乙個輸入數字時那麼sum-dp[sum/2]即為所求最優值。

放球問題(動態規劃) 網易2018筆試題

給a b c d四種球,每種球有各自的質量和各自的個數,現在有乙個籃子,將球放入籃子會得到相應的分數,分數的計算方法是籃子當前的總質量的末尾數乘以放入球的質量,這樣球放入的順序不同,得到的分數不同,現在要求放入所有球的最大分數。輸入 1 1 1 1 11 12 13 14 輸出 235分析 使用動態...

網易 合唱團 動態規劃

網易筆試題 合唱團 問題描述 有 n 個學生站成一排,每個學生有乙個能力值,牛牛想從這 n 個學生中按照順序選取 k 名學生,要求相鄰兩個學生的位置編號的差不超過 d,使得這 k 個學生的能力值的乘積最大,你能返回最大的乘積嗎?每個輸入包含 1 個測試用例。每個測試資料的第一行包含乙個整數 n 1 ...

動態規劃題(阿里筆試)

有個窮困的藝術家。他畫了一幅超現實主義的作品 方塊手拉手 現在他已經把圖畫中手拉手的一排大小不一的方塊都畫出來了。現在要考慮上顏色了。可惜他手中的錢並不多了。但是他是個有追求的人,他希望這幅畫中每兩個相鄰的方塊的顏色是不一樣的。你能幫他計算一下把這幅畫上色後,最少需要花多少錢麼。輸入 n個方塊,k個...