01揹包問題之2(大規模資料的情況)

2021-10-01 03:39:15 字數 803 閱讀 6485

有n個重量和價值分別為wi, vi的物品,從這些物品中挑選出總重量不超過w的物品,求所有挑選方案中價值的最大值

與前面唯一不同的地方便是w達到了10 ^ 9、wi到達1了10 ^ 7;

變換思路:定義dp[i+1][j]為前i個物品中挑選出價值總和為j時總重量的最小值(不存在時就是乙個充分大的數inf)。

因為前0個物品什麼也選擇不了、故

dp[0][0] = 0;

dp[0][j]=inf;

此外 前i個物品挑選出價值總和為j時,一定有

前i-1個物品中挑選價值總和為j的部分

前i-1個物品中挑選價值總和為j-v[i]的部分,然後在選中第i個物品

於是又遞推式dp[i+1][j] = min(dp[i][j], dp[i][j-v[i]] + w[i])

最終的答案就對應於dp[n][j] <= w的最大的j;

#include

using

namespace std;

int dp[

101]

[10001

], w[

101]

, v[

101]

;int

main()

}int res =0;

for(

int i =

0; i <= n * w;

++i)

if(dp[n]

[i]<= w)res = i;

cout << res << endl;

return0;

}

大揹包問題(01揹包)

大揹包問題 有n乙個重量和 值分別w i 和v i 專案。出的這些產品中的總重量不超過w專案。查詢所有選定的方案 值的最大總和值。其中,1 n 40,1 w i v i 10 15,1 w 10 15.這個問題給人的第一感覺就是普通的01揹包。只是,看完資料範圍會發現。這次價值和重量都能夠是很大的數...

01揹包問題 大揹包

i i 物體索引 0 n j jj 揹包容量 0 w dpdp dp 最大價值 為了降低時間複雜度我們必須要改變dp陣列含義為。由於時間複雜度主要由i ii和j jj的含義決定,所以我們必須將i ii和j jj的含義於取值返回比較小的n nn和v vv陣列聯絡起來,將較大的w ww與dpdp dp陣...

揹包問題之01揹包問題

題目 有n件物品和乙個容量為v的揹包。第i件物品的容量是c i 價值為w i 求解將哪些物品裝入揹包可以使得這些物品的費用總和不超過揹包容量,且價值總和最大。基本思路 作為最基礎的揹包問題,特點是 每種物品只有一件,可以選擇放或者是不放。用子問題定義狀態 f i v 表示前i件物品恰好放入乙個容量為...