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

2021-08-09 23:57:25 字數 1051 閱讀 5694

超大揹包問題

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

1<=n<=40

1<=w(i),v(i)<=1e15

1<=w<=1e15

輸入第一行為n,接著輸入一行w(i)和一行v(i),最後輸入w佔單獨一行

輸出單獨一行即所有挑選方案中價值總和的最大值

樣例input

2 1 3 2

3 2 4 2

output

思路**

#include#include#include#includeusing namespace std;

typedef long long ll;

const int maxn = 50;

const ll inf = 1e18;

int n;

ll w[maxn], v[maxn], w;

pairps[1 << (maxn / 2)];//重量,價值

void solve()

} ps[i] = make_pair(sw, sv);

} //去除肯定不選擇的情況(這部分**要多看幾遍)

int cnt = 1;

sort(ps, ps + (1 << n2));//按重量排序

for (int i = 1; i < 1 << n2; i++)

} //列舉剩下物品的選擇情況並更新結果

ll ans = 0;

for (int i = 0; i < 1 << (n - n2); i++)

} if (sw < w)

/*lower_bound(ps, ps + cnt, make_pair(w - sw, inf)會尋找陣列ps中first值

第乙個大於等於w - sw的元素,自己測試了下這裡的second對搜尋結果沒有影響。

*/} printf("%lld\n", ans);

}int main()

return 0;

}

超大揹包問題 折半列舉

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

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

題意 有重量和價值分別為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號物品 分析 這個問題是前面介紹過的揹包問題,...

超大揹包問題 折半搜尋

超大揹包問題 有n個重量和價值分別為w i 和v i 的物品,從這些物品中挑選總重量不超過w的物品,求所有挑選方案中價值總和的最大值。其中,1 n 40,1 w i v i 10 15,1 w 10 15.按照普通的dp 思路顯然是無法求解的,揹包的體積太大了,那麼就要換種思考的方向,觀察物品的數量...