超大揹包問題:有n個重量和價值分別為w[i]和v[i]的物品,從這些物品中挑選總重量不超過w的物品,求所有挑選方案中價值總和的最大值。其中,1 ≤ n ≤ 40, 1 ≤ w[i], v[i] ≤ 10^15, 1 ≤ w ≤ 10^15.
按照普通的dp 思路顯然是無法求解的, 揹包的體積太大了, 那麼就要換種思考的方向,觀察物品的數量只有 40 個,普通的列舉話 2 ^ 40,肯定是超時,那麼如何是分成兩堆呢 ? 在按照字典序去列舉,不就沒問題了嗎 ?
int n, w;int v[50], w[50];
struct node
}pre[1<<25];
bool cmp(node a, node b)
int ans;
int fun(int l, int r, int key)
return pre[r].ww;
}void solve()
}pre[i] = node(sw, sv);
}sort(pre, pre+ (1 << n2), cmp);
int m = 0;
for(int i = 1; i < 1<> j) & 1)
}if (sv <= w)
}}int main()
solve();
printf("%d\n", ans);
}return 0;}/*
4 52 3
1 23 4
2 2*/
超大揹包問題 折半列舉
超大揹包問題 有重量和價值分別為wi,vi的n個物品,從這些物品中挑選總重量不超過w的物品,求所有挑選方案中價值總和的最大值。1 1 1因為wi,太大,陣列開不了,而我們發現n的數量較少,可以使用折半列舉。首先列舉前n 2個揹包的所有可能結果,儲存在結構體ps n sv ps n sw中,然後按sw...
超大揹包問題(折半列舉)
超大揹包問題 有重量和價值分別為w i v i 的n個物品,從這些物品中選出總重不超過w的物品,求所有挑選方案中價值總和的最大值 1 n 40 1 w i v i 1e15 1 w 1e15 輸入第一行為n,接著輸入一行w i 和一行v i 最後輸入w佔單獨一行 輸出單獨一行即所有挑選方案中價值總和...
超大揹包問題 (折半列舉)
題意 有重量和價值分別為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號物品 分析 這個問題是前面介紹過的揹包問題,...