演算法十七 揹包問題1

2021-08-21 04:39:41 字數 1142 閱讀 3771

n種物品,每種物品有相應的價值和體積,同時物品還分為兩類,一類是「單個物品」,即該種物品只有乙個;一類是「多個物品」,即該種物品有無限個。

現在你有乙個體積為v的揹包,那麼該裝些什麼物品到揹包裡使得價值之和最大呢?

第一行包含兩個正整數n,v。

接下來n行,每行代表一種物品。每行的第乙個數字表示該物品的種類(若為0表示「單個物品」,若為1表示「多個物品」),第二個數字表示該物品的價值,第三個數字表示該物品的體積。

輸出乙個整數,表示最大的價值之和。

5  8

0  6  8

0  7  3

1  1  1

0  8  1

0  5  2

第三種物品有無限個,其餘都是單個物品。

若我們放入物品1,則揹包已經裝滿,此時價值和為6;

若我們放入物品2、4、5,揹包所剩體積為8-3-1-2=2,此時價值和為7+8+5=20;

若我們放入8個物品3,揹包裝滿,此時價值之和為8×1=8;

若我們放入物品2、4、5,再放兩個物品3,則揹包裝滿,此時價值和為7+8+5+2×1=22。

可以驗證,最優答案就是22。

// ***************== **實現開始 ***************==

const int n = 5005;

//f:動態規劃的陣列,f[i]表示容量為i的揹包的最大價值

int f[n];

// n:物品個數

// v:揹包的體積

// t:長度為n的陣列,第i個元素若為0,表示物品i為單個物品;若為1,表示物品i為多個物品。(i下標從0開始,下面同理)

// w:長度為n的陣列,第i個元素表示第i個物品的價值

// v:長度為n的陣列,第i個元素表示第i個物品的體積

// 返回值:最大價值之和

int getanswer(int n, int v, vectort, vectorw, vectorv)

// ***************== **實現結束 ***************==

演算法(揹包問題 01揹包問題)

01揹包問題 有 n 件物品和乙個容量是 v 的揹包。每件物品只能使用一次。第 i 件物品的體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出最大價值。輸入格式 第一行兩個整數,n,v,用空格隔開,分別表示物品數量和揹包容積。接下來有 n 行,...

揹包問題1

有n個魔法石,重量分別為w1,w2,w3 wn,有乙個可裝重量為s的揹包,從n件魔法石中取若干件,使得放入揹包的重量之和剛好為s,求放的方法,若不存在該種情況則輸出failed。輸入樣例 10 s 5 n 重量 1 2 3 4 5 輸出樣例 1 4 5 遞迴,即乙個乙個將物品放入揹包內試一下,設函式...

揹包問題1

做了兩道揹包問題,迷迷糊糊也算是弄懂了一些揹包的模型。poj1837 這個題主要是建立揹包模型bi比較難,當時沒有想到第二維可以是平衡狀態,看到網上大佬的提示才想到,如下 include include include includeusing namespace std int dp 25 150...