當揹包問題的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揹包。不過,看完資料範圍會發現,這次價值和重量都可以是非常...