01揹包優先佇列優化
01揹包優先佇列優化
設重量為w,權值為v
則單位重量價值為v / w
設有物品1,物品2
若v1 / w1 < v2 / w2
則說明v2的單位重量價值高
即v1 * w2 < v2 * w1
於是可過載結構體,使得v2 * w1大的優先順序高
即:
struct Node {
LL w, v;
Node() {};
Node(LL _w, LL _v) {w = _w, v = _v;}
friend bool operator < (Node a, Node b) {
return a.v * b.w < b.v * a.w;
}
};
重點是本題資料範圍
1 <= w <= 100
1 <= v <= 1e9
可見價值與質量相比
價值占主導地位
接著按照貪心的思想
單位重量價值越高的越先裝入揹包
本題結束
AC程式碼:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long LL;
struct Node {
LL w, v;
Node() {};
Node(LL _w, LL _v) {w = _w, v = _v;}
friend bool operator < (Node a, Node b) {
return a.v * b.w < b.v * a.w;
}
};
LL dp[105];
int main()
{
LL n, m, w, v;
while(scanf("%lld%lld", &n, &m) != EOF) {
priority_queue<Node> q;
for(int i = 0; i < n; i ++) {
scanf("%lld%lld", &w, &v);
q.push(Node(w, v));
}
LL ans = 0;
while(m > 100) {
ans += q.top().v;
m -= q.top().w;
q.pop();
}
memset(dp, 0, sizeof(dp));
while(!q.empty()) {
w = q.top().w;
v = q.top().v;
q.pop();
for(int i = m; i >= w; i --) {
dp[i] = max(dp[i], dp[i - w] + v);
}
}
ans += dp[m];
printf("%lld\n", ans);
}
return 0;
}
相關文章
- 多重揹包問題的單調佇列優化佇列優化
- 01揹包空間優化優化
- PHP優先佇列PHP佇列
- 堆--優先佇列佇列
- 優先佇列 (轉)佇列
- 【Dijkstra演算法】未優化版+優先佇列優化版演算法優化佇列
- 淺談優先佇列佇列
- STL 優先佇列 用法佇列
- 堆與優先佇列佇列
- 堆和優先佇列佇列
- 優先佇列和堆排序佇列排序
- 堆排序與優先佇列排序佇列
- Java優先佇列(PriorityQueue)示例Java佇列
- 01揹包動態規劃空間優化動態規劃優化
- NO GAME NO LIFE(優先佇列/最小堆)GAM佇列
- 優先佇列的比較器佇列
- 封裝優先順序佇列封裝佇列
- 二叉堆優先佇列佇列
- POJ 3253 Fence Repair 優先佇列AI佇列
- 堆——神奇的優先佇列(上)佇列
- 優先佇列的效能測試佇列
- hdu5040 優先佇列+bfs佇列
- UVA 674 01揹包 2進位制優化 DP優化
- 棧,佇列,優先順序佇列簡單介面使用佇列
- Redis實現任務佇列、優先順序佇列Redis佇列
- 演算法面試(三) 優先佇列演算法面試佇列
- STL優先佇列最小堆最大堆佇列
- STL醜數(set+優先佇列)佇列
- 【圖論】拓撲排序+優先佇列圖論排序佇列
- 1007(優先佇列)佇列
- POJ 1724 ROADS(優先佇列+spfa)佇列
- POJ2431 Expedition (優先佇列)佇列
- POJ 2051(最小堆/優先佇列)佇列
- 2. 揹包,佇列和棧佇列
- 佇列 優先順序佇列 python 程式碼實現佇列Python
- .NET 6 優先佇列 PriorityQueue 實現分析佇列
- Java優先順序佇列DelayedWorkQueue原理分析Java佇列
- C++ STL 優先佇列 (priority_queue)C++佇列