超大揹包問題 折半搜尋

2022-06-27 08:48:10 字數 747 閱讀 7077

超大揹包問題:有n個重量和價值分別為w[i]和v[i]的物品,從這些物品中挑選總重量不超過w的物品,求所有挑選方案中價值總和的最大值。其中,1 ≤ n ≤ 40, 1 ≤ w[i], v[i] ≤ 10^15, 1 ≤ w ≤ 10^15.

按照普通的dp 思路顯然是無法求解的, 揹包的體積太大了, 那麼就要換種思考的方向,觀察物品的數量只有 40 個,普通的列舉話 2 ^ 40,肯定是超時,那麼如何是分成兩堆呢 ? 在按照字典序去列舉,不就沒問題了嗎 ?

int n, w;

int v[50], w[50];

struct node

}pre[1<<25];

bool cmp(node a, node b)

int ans;

int fun(int l, int r, int key)

return pre[r].ww;

}void solve()

}pre[i] = node(sw, sv);

}sort(pre, pre+ (1 << n2), cmp);

int m = 0;

for(int i = 1; i < 1<> j) & 1)

}if (sv <= w)

}}int main()

solve();

printf("%d\n", ans);

}return 0;}/*

4 52 3

1 23 4

2 2*/

超大揹包問題 折半列舉

超大揹包問題 有重量和價值分別為wi,vi的n個物品,從這些物品中挑選總重量不超過w的物品,求所有挑選方案中價值總和的最大值。1 1 1因為wi,太大,陣列開不了,而我們發現n的數量較少,可以使用折半列舉。首先列舉前n 2個揹包的所有可能結果,儲存在結構體ps n sv ps n sw中,然後按sw...

超大揹包問題(折半列舉)

超大揹包問題 有重量和價值分別為w i v i 的n個物品,從這些物品中選出總重不超過w的物品,求所有挑選方案中價值總和的最大值 1 n 40 1 w i v i 1e15 1 w 1e15 輸入第一行為n,接著輸入一行w i 和一行v i 最後輸入w佔單獨一行 輸出單獨一行即所有挑選方案中價值總和...

超大揹包問題 (折半列舉)

題意 有重量和價值分別為wi,vi的n個物品。從這些物品中挑選總重量不超過w的物品,求所有挑選方案中價值總和的最大值。限制條件 1 n 40 1 wi,vi 10 的15次冪 1 w 10的15次冪 輸入 n 4 w v w 5 輸出 7 挑選0 1 3號物品 分析 這個問題是前面介紹過的揹包問題,...