華為機試 購物單

2021-07-11 09:24:52 字數 2102 閱讀 4052

輸入例子:

1000 5

800 2 0

400 5 1

300 5 1

400 3 0

500 2 0

輸出例子:

2200

解題思路:這是一道揹包問題。

先考慮解決揹包問題,思路是這樣:比如說這道題目,給定總錢數n,共有m件商品可以購買,從這m件商品中選擇購買商品,使得購買商品的錢數不超過n,同時滿足一定的條件k(如上面提到的每件商品的重要度與其價錢相乘的乘積之和最大)。

現在開始購買了並且我們手裡有n元錢,我們從第m件商品開始考慮。對於第m件商品,首先我們要看我們手頭的n元錢是不是能夠付得起買第m件商品的錢。

1、如果手頭的錢n元買不起第m件商品。那麼我們就放棄這件商品,拿上這n元錢去買前m-1件商品。

(這就轉化為原問題的乙個子問題,我覺得我不考慮子問題怎麼解,子問題讓別人幫我解。繼續往下走)

2、如果我手頭的n元錢買的起第m件商品。那麼我也有兩種選擇

2.1 第一種選擇,我不買第m件商品,我用n元錢買前m-1件商品,我看看我能達到到的條件k是什麼。對於這道題目就是

v[j 1 ]*w[j 1 ]+v[j 2 ]*w[j 2 ]+ … +v[j k ]*w[j k ]的最大值。

(這就轉化為原問題的乙個子問題,我覺得我不考慮子問題怎麼解,子問題讓別人幫我解。繼續往下走)

2.2第二種選擇,我買下第m件商品,這用我花掉了v[m]元錢,還剩下n-

v[m]元錢。我再用剩下的錢去買前m-1件商品。這樣我也可以淺出乙個v[j 1 ]*w[j 1 ]+v[j 2 ]*w[j 2 ]+ … +v[j k ]*w[j k ]的最大值。(這就轉化為原問題的乙個子問題,我覺得我不考慮子問題怎麼解,子問題讓別人幫我解。繼續往下走)

如果2.1和2.2的情況我都能得到結果了,我就比較這兩種情況,看哪個能使我的利益最大化,我就選哪個方案。至此,問題就算完成了。而題目的要求只是稍微與上面的問題有所不同,稍作修改即可。

下面就根據上面的思路列方程:

假設我們用value[i][j]來表示用j元錢,給定前i個

物品(1、2、...、i)供你選擇來購買方案的情況下v[j 1 ]*w[j 1 ]+v[j 2 ]*w[j 2 ]+ … +v[j k ]*w[j k ] 能夠達到的最大值。根據上面的分析有:

1、手頭的錢j元買不起第i件商品。

value[i][j]=value[i-1][j]

(注意:下面的c++程式中這裡的value[i][j]=0,如果我寫成前面的話通不過乙個測試用例,具體我也沒有搞清楚為什麼。)

2、對應前面的第2中方案,

j元買得起第i件商品

2.1value[i][j] = value[i-1][j]

2.2 value[i][j] = value[i -1][j - v[i]] + w[i]

偽**:

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

for (int j = 1; j <= n; j++)

else }

本題**:只是把上述問題的解稍作修改即可滿足,具體如下。

#include #include #include using namespace std;

struct goods

};int max(int a, int b)

int main(void)

vector> value(m + 1, vector(n + 1));

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

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

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

else

else

else }}

} }cout << value[m][n] << endl;

return 0;

}

我的思考:如果要求沒見商品只能選一件的話,這種解法需要所有的主件排在所有附件的後面。如果有附件排在它的主件後面,那麼選擇的時候可能會選擇兩件主件,這樣就和只能選一件商品的要求不符合。

我看給出的測試用例裡,所有的商品都為主件,因此沒有暴露出這個問題。但是,我們必須意識到存在這樣的問題。

華為機試 購物單

王強今天很開心,公司發給n元的年終獎。王強決定把年終獎用於購物,他把想買的物品分為兩類 主件與附件,附件是從屬於某個主件的,下表就是一些主件與附件的例子 主件附件 電腦印表機,掃瞄器 書櫃圖書 書桌檯燈,文具 工作椅無 如果要買歸類為附件的物品,必須先買該附件所屬的主件。每個主件可以有 0 個 1 ...

購物單 華為機試 C C

別人分享的 下面例子測試不過去 30 4 10 5 4 10 5 4 10 5 0 10 1 0 應該輸出 150王強今天很開心,公司發給n元的年終獎。王強決定把年終獎用於購物,他把想買的物品分為兩類 主件與附件,附件是從屬於某個主件的,下表就是一些主件與附件的例子 主件附件 電腦印表機,掃瞄器 書...

華為機試16 購物單

題目描述 王強今天很開心,公司發給n元的年終獎。王強決定把年終獎用於購物,他把想買的物品分為兩類 主件與附件,附件是從屬於某個主件的,下表就是一些主件與附件的例子 主件 附件 電腦 印表機,掃瞄器 書櫃 圖書 書桌 檯燈,文具 工作椅 無 如果要買歸類為附件的物品,必須先買該附件所屬的主件。每個主件...