162 超大揹包問題 (雙向搜尋)

2021-07-09 09:40:54 字數 772 閱讀 1746

當揹包問題的w和v都巨大時,時間複雜度和空間複雜度都不能滿足要求,只能利用雙向搜尋的方法來求解:

首先將陣列分成量部分,對第一部分用位操作的方法來列舉所有的子集的w和v(和),然後排序,去重(去除那些明顯不可能的解)

然後對第二部分進行同樣的列舉操作,從而找到重量不超過的情況下,價值的最大值。

需要注意的是lower_bound函式的問題,在比較pair型別的元素時,first和second都會進行比較,導致會有一些小問題出現。

個人比較傾向於使用upper_bound(ps, ps+m make_pair(w-sw,inf))-1 的方式來實現。

//// 162_large nk.cpp

// changlle

//// created by user on 1/10/16.

//#include using namespace std;

typedef long long ll;

const ll inf=1000;

int n=4;

ll w[4]=;

ll v[4]=;

ll w=5;

pairps[1<<(20/2)];

void solve()

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

}sort(ps,ps+(1<>j&1)

}if (sw<=w)

}cout//

// cout<<(lower_bound(b,b+3,make_pair(5,5)))->second<

超大揹包問題 折半搜尋

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

超大揹包問題

運用二進位制,折半搜尋,其實我覺得本質就是狀壓思想,列舉前一半所有情況並儲存。然後排序保障總質量越大,價值越大。這裡相當於貪心。可以證明的,如果在一堆一一對應的數裡面,只取乙個,另外乙個數越大才越有可能是最優解。這個思想大概只能用在只取乙個上面。再列舉後半部分。算出每一種列舉方式的總質量,w wi就...

超大揹包問題(01揹包)

超大揹包問題 有n個重量和價值分別為w i 和v i 的物品,從這些物品中挑選總重量不超過w的物品,求所有挑選方案中價值總和的最大值。其中,1 n 40,1 w i v i 10 15,1 w 10 15.這個問題給人的第一感覺就是普通的01揹包。不過,看完資料範圍會發現,這次價值和重量都可以是非常...