vector<double> KnapsackFractional(int W, vector<int>& wt, vector<int>& val, int n) { vector<pair<double, int>> vw(n); for (int i = 0; i < n; i++) { vw[i] = { val[i] * 1.0 / wt[i], i }; } sort(vw.rbegin(), vw.rend()); vector<double> res(n, 0.0); double w = 0.0; for (int i = 0; i < n; i++) { if (w + wt[vw[i].second] <= W) { res[vw[i].second] = 1.0; w += wt[vw[i].second]; } else { double r = (W - w) * 1.0 / wt[vw[i].second]; res[vw[i].second] = r; w += r * wt[vw[i].second]; break; } } return res; } int main() { int W = 4; vector<int> wt = { 10, 20, 30 ,40}; vector<int> val = { 60, 10, 16 ,101}; int n = wt.size(); vector<double> res = KnapsackFractional(W, wt, val, n); cout << "装入物品的对应指示向量为:"; for (int i = 0; i < res.size(); i++) { cout << res[i] << " "; } cout << endl; return 0; }流程图
时间: 2024-03-05 11:47:21 浏览: 190
Vector Calculus
抱歉,我无法呈现流程图,但我可以为您解释一下该代码的流程:
1. 首先将每个物品的价值和重量的比值存入一个 pair 中,并按照比值从大到小排序,用于后面选择物品。
2. 初始化一个长度为 n 的 double 类型数组 res,并将其所有元素赋值为 0.0。
3. 初始化一个当前背包重量 w,开始遍历每个物品。
4. 如果当前背包重量加上该物品的重量小于等于背包容量 W,则将该物品全部装入背包,将 res 数组对应位置赋值为 1.0。
5. 如果当前背包重量加上该物品的重量大于背包容量 W,则只能装入该物品的一部分,计算出装入该物品的最大比例 r,将 res 数组对应位置赋值为 r。
6. 将背包重量加上装入该物品的重量乘以比例 r。
7. 结束遍历后,返回 res 数组作为装入物品的对应指示向量。
阅读全文