程式設計題3 01揹包問題(vivo筆試第三題)

2021-09-24 05:53:44 字數 2424 閱讀 3856

0-1 揹包問題:給定 n 種物品和乙個容量為 c 的揹包,物品 i 的重量是 wi,其價值為 vi 。

問:應該如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?

分析一波,面對每個物品,我們只有選擇拿取或者不拿兩種選擇,不能選擇裝入某物品的一部分,也不能裝入同一物品多次。

解決辦法:宣告乙個 大小為  m[n][c] 的二維陣列,m[ i ][ j ] 表示 在面對第 i 件物品,且揹包容量為  j 時所能獲得的最大價值 ,那麼我們可以很容易分析得出 m[i][j] 的計算方法,

(1). j < w[i] 的情況,這時候揹包容量不足以放下第 i 件物品,只能選擇不拿

m[ i ][ j ] = m[ i-1 ][ j ]

(2). j>=w[i] 的情況,這時揹包容量可以放下第 i 件物品,我們就要考慮拿這件物品是否能獲取更大的價值。

如果拿取,m[ i ][ j ]=m[ i-1 ][ j-w[ i ] ] + v[ i ]。 這裡的m[ i-1 ][ j-w[ i ] ]指的就是考慮了i-1件物品,揹包容量為j-w[i]時的最大價值,也是相當於為第i件物品騰出了w[i]的空間。

如果不拿,m[ i ][ j ] = m[ i-1 ][ j ] , 同(1)

究竟是拿還是不拿,自然是比較這兩種情況那種價值最大。

由此可以得到狀態轉移方程:

if(j>=w[i])

m[i][j]=max(m[i-1][j],m[i-1][j-w[i]]+v[i]);

else

m[i][j]=m[i-1][j];

例:0-1揹包問題。在使用動態規劃演算法求解0-1揹包問題時,使用二維陣列m[i][j]儲存揹包剩餘容量為j,可選物品為i、i+1、……、n時0-1揹包問題的最優值。繪製

價值陣列v = ,

重量陣列w = ,

揹包容量c = 12時對應的m[i][j]陣列。

0    1    2    3    4    5      6      7      8      9      10    11    12

1    0    0    0    8    8      8      8      8      8      8      8      8

2    0    0    0    8    8      10    10    10    10    18    18    18

3    0    6    6    8    8      14    14    16    16    18    18    24

4    0    6    6    9    9      14    14    17    17    19    19    24

5    0    6    6    9    9      14    14    17    17    19    21    24

6    2    6    8    9    11    14    16    17    19    19    21    24

(第一行和第一列為序號,其數值為0)

如m[2][6],在面對第二件物品,揹包容量為6時我們可以選擇不拿,那麼獲得價值僅為第一件物品的價值8,如果拿,就要把第一件物品拿出來,放第二件物品,價值10,那我們當然是選擇拿。m[2][6]=m[1][0]+10=0+10=10;依次類推,得到m[6][12]就是考慮所有物品,揹包容量為c時的最大價值。

vivo提前批筆試

0-1 揹包問題:給定 n 種物品和乙個容量為 c 的揹包,物品 i 的重量是 wi,其價值為 vi 。

問:應該如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?

輸入:第一行是乙個正整數,標書揹包總容量

第二行是乙個長度為n的正整數陣列,表示物品的重量

第三行是乙個長度為n的正整數陣列,表示物品的價值

輸出:乙個正整數,表示可獲得的最大價值

例、輸入:

1000

200 600 100 180 300 450

6 10 3 4 5 8

輸出:21

#include int m[1000][10000];

int main(void)

; char ch;

int w[1000] = ;

int v[1000] = ;

scanf("%d", &weight);

do while (ch != '\n');

num = i;

do while (ch != '\n');

for (i = 1; i <= num; i++)

else

else

}} }

printf("%d", m[i-1][j-1]);

return 0;

}

關鍵所在  if (m[i - 1][j] > m[i-1][j-w[i]]+v[i])

200219題(簡單的01揹包問題vivo)

題目 小v負責一次活動禮品採購,每一款禮品的受歡迎程度 熱度值 各不相同,現給出總金額以及各個禮品的單價和熱度值,且每個禮品只購買乙個,如何購買可以使得所有禮品的總熱度值最高。輸入 第一行是乙個正整數,表示總金額 不大於1000 第二行是乙個長度為n的正整數陣列,表示禮品單價 n不大於100 第三行...

每日程式設計題之揹包問題

先從栗子出發,你是乙個有理想的吃貨,你的肚子只能容納5kg的東西,為了保證你的營養最大化,有以下幾種食物可以選擇 食物 v w 質量價值 0kg1kg 2kg3kg 4kg5kg 黃瓜1kg50 5131317 23西紅柿 1kg808 8121818 公尺飯2kg40 041010 14牛肉 3k...

刷題之路 揹包問題

乙個揹包有一定的承重cap,有n件物品,每件都有自己的價值,記錄在陣列v中,也都有自己的重量,記錄在陣列w中,每件物品只能選擇要裝入揹包還是不裝入揹包,要求在不超過揹包承重的前提下,選出物品的總價值最大。給定物品的重量w價值v及物品數n和承重cap。請返回最大總價值。經典動態規劃問題,類似於找零錢問...