上機筆試程式設計訓練 揹包問題

2021-07-22 11:12:00 字數 1425 閱讀 1027

王強今天很開心,公司發給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 ] 。(其中 * 為乘號)

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

輸入描述:

輸入的第 1 行,為兩個正整數,用乙個空格隔開:n m

(其中 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 )。

輸入例子:

1000 5

800 2 0

400 5 1

300 5 1

400 3 0

500 2 0

輸出例子:

2200

#include using namespace std;

const int n = 100, m = 33000;

int v[n][3], c[n][3], f[m];

int n, m, cnt;

int main()

}for(int i = 1; i <= n; ++i)

if(cst <= k) f[k] = max(f[k], f[k - cst] + val);

} }}

printf("%d\n", f[m]);

}return 0;

}

筆試中揹包問題的應用

這是小菜鳥我自己的一點小總結,為了在面試中更加得心應手。後面遇到的相關問題不定期更新到這篇博文中,如果有什麼錯誤請各位大神不吝賜教,如果有什麼問題請各位多包涵。講講01揹包的應用,01揹包的主要特點是每個物品只能選取乙個,容量一定,要求選取的物品價值最大,揹包問題的變形很經典,思路是一樣的,列舉下目...

演算法訓練 裝箱問題(0 1揹包)

時間限制 1 sec 記憶體限制 256 mb 提交 1 解決 1 提交 狀態 討論版 有乙個箱子容量為v 正整數,0 v 20000 同時有n個物品 0 n 30 每個物品有乙個體積 正整數 要求n個物品中,任取若干個裝入箱內,使箱子的剩餘空間為最小。第一行為乙個整數,表示箱子容量 第二行為乙個整...

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

0 1 揹包問題 給定 n 種物品和乙個容量為 c 的揹包,物品 i 的重量是 wi,其價值為 vi 問 應該如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?分析一波,面對每個物品,我們只有選擇拿取或者不拿兩種選擇,不能選擇裝入某物品的一部分,也不能裝入同一物品多次。解決辦法 宣告乙個 大...