超大揹包問題
有重量和價值分別為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 思路顯然是無法求解的,揹包的體積太大了,那麼就要換種思考的方向,觀察物品的數量...