解決01揹包問題的DP方法

2021-07-22 09:50:23 字數 1608 閱讀 2241

解題參考:

題目描述:

現有一筆經費可以報銷一定額度的發票。允許報銷的發票型別包括買圖書(a類)、文具(b類)、差旅(c類),要求每張發票的總額不得超過1000元,每張發票上,單項物品的價值不得超過600元。現請你編寫程式,在給出的一堆發票中找出可以報銷的、不超過給定額度的最大報銷額。

輸入:測試輸入包含若干測試用例。每個測試用例的第1行包含兩個正數 q 和 n,其中 q 是給定的報銷額度,n(n<=30)是發票張數。隨後是 n 行輸入,每行的格式為:

m type_1:price_1 type_2:price_2 ... type_m:price_m

其中正整數 m 是這張發票上所開物品的件數,type_i 和 price_i 是第 i 項物品的種類和價值。物品種類用乙個大寫英文本母表示。當n為0時,全部輸入結束,相應的結果不要輸出。

輸出:對每個測試用例輸出1行,即可以報銷的最大數額,精確到小數點後2位。

樣例輸入:

200.00 3

2 a:23.50 b:100.00

1 c:650.00

3 a:59.99 a:120.00 x:10.00

1200.00 2

2 b:600.00 a:400.00

1 c:200.50

1200.50 3

2 b:600.00 a:400.00

1 c:200.50

1 a:100.00

100.00 0

樣例輸出:

123.50

1000.00

1200.50

#include#include #include#include#include#include #include # include #include # include #include # include # include # include using namespace std;

//解決01揹包問題動態規劃陣列

int dp[3000010];

int main()

if( total > 1000 )

ok =false;

if( ok == false )

continue;

weight.push_back( total *100 );

} memset( dp, 0,sizeof(dp));

int q = (int ) (q * 100);

for( int w = 0; w < weight .size() ; w ++)

;vector < bg > bgs(31);

int cmp( bg a, bg b)

int main()

memset( dp , 0, sizeof(dp));

sort( bgs.begin(),bgs.end() ,cmp );

for( int i = 0; i< bgs.size() ; i++)

}} cout<

01揹包問題 dp

這道題需要從定義去理解 dp i 1 j 定義為 在前i個物品裡面選出來的總體積不大於j的最大的價值 所以這樣就可以知道了,dp i 1 j 就表示在前i個物體裡面選出來的不超過給定體積的最大價值了 所以清楚定義後就有 如果當前超過了當前體積了 那麼他肯定就是dp i 1 j dp i j 了 如果...

01揹包問題(dp)

思路 填表。以下有幾種情況 情況一 第j件放不進去 當前容量i小於第i件物品 這時所得價值為 dp i j dp i j 1 情況二 第j件不放進去 容量足夠 這時所得價值為 dp i j dp i j 1 情況三 第j件放進去 容量足夠 這時所得價值為 dp i weigh j j 1 value...

01揹包問題 DP

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