購物單 動態規劃 揹包問題

2022-02-16 06:28:48 字數 1569 閱讀 1047

題目敘述的言語倒是蠻多的:

王強今天很開心,公司發給n元的年終獎。王強決定把年終獎用於購物,他把想買的物品分為兩類:主件與附件,附件是從屬於某個主件的,下表就是一些主件與附件的例子:

主件附件

電腦印表機,掃瞄器

書櫃圖書

書桌檯燈,文具

工作椅無

如果要買歸類為附件的物品,必須先買該附件所屬的主件。每個主件可以有 0 個、 1 個或 2 個附件。附件不再有從屬於自己的附件。王強想買的東西很多,為了不超出預算,他把每件物品規定了乙個重要度,分為 5 等:用整數 1 ~ 5 表示,第 5 等最重要。他還從網際網路上查到了每件物品的**(都是 10 元的整數倍)。他希望在不超過 n 元(可以等於 n 元)的前提下,使每件物品的**與重要度的乘積的總和最大。

設第 j 件物品的**為 v[j] ,重要度為 w[j] ,共選中了 k 件物品,編號依次為 j 1 , j 2 ,……, j k ,則所求的總和為:

v[j 1 ]*w[j 1 ]+v[j 2 ]*w[j 2 ]+ … +v[j k ]*w[j k ] 。(其中 * 為乘號)

請你幫助王強設計乙個滿足要求的購物單。

輸入描述:

(其中 n ( <32000 )表示總錢數, m ( <60 )為希望購買物品的個數。)

從第 2 行到第 m+1 行,第 j 行給出了編號為 j-1 的物品的基本資料,每行有 3 個非負整數 v p q

(其中 v 表示該物品的**( v<10000 ), p 表示該物品的重要度( 1 ~ 5 ), q 表示該物品是主件還是附件。如果 q=0 ,表示該物品為主件,如果 q>0 ,表示該物品為附件, q 是所屬主件的編號)

輸出描述:

輸出檔案只有乙個正整數,為不超過總錢數的物品的**與重要度乘積的總和的最大值( <200000 )。

**(成本)

12int value[60][3]=; //

價值(重要度***)

13int f[60][3200]; //

第i個物品在j容量下可以獲得的最大價值

14int

i,j;

1516 cin >> n >>m;

17 n/=10; //

都是10的整數,先除以10,減少迴圈次數

18//

儲存清單

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

30else

35else39}

40}41//

遍歷計算

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

43for(j=n;j>0;j--)

53 cout << f[m][n]*10

<

54 }

揹包問題,道阻且長!

有依賴的揹包問題 華為機試 購物單 。動態規劃

今天刷到一道有依賴的揹包問題,是牛客的華為機試題,記錄下解法。題目如下 王強今天很開心,公司發給n元的年終獎。王強決定把年終獎用於購物,他把想買的物品分為兩類 主件與附件,附件是從屬於某個主件的,下表就是一些主件與附件的例子 主件 附件 電腦 印表機,掃瞄器 書櫃 圖書 書桌 檯燈,文具 工作椅 無...

演算法 動態規劃之購物單

分析和思路 把附件1和附件2輸入後,然後用 只買主件 只買主件 附件1 只買主件 附件2 買主件 附件1 附件2 實際歸為了新的產品種類。然後建立狀態轉移方程即可。詳細 如下 在狀態轉移時如何判斷這個主件有幾個附件?答案是不需要判斷,直接用 if j zj i if j zj i fj1 i 這樣的...

華為機試 購物單 分組揹包

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