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 18:47:21 浏览: 10
抱歉,我无法呈现流程图,但我可以为您解释一下该代码的流程:
1. 首先将每个物品的价值和重量的比值存入一个 pair 中,并按照比值从大到小排序,用于后面选择物品。
2. 初始化一个长度为 n 的 double 类型数组 res,并将其所有元素赋值为 0.0。
3. 初始化一个当前背包重量 w,开始遍历每个物品。
4. 如果当前背包重量加上该物品的重量小于等于背包容量 W,则将该物品全部装入背包,将 res 数组对应位置赋值为 1.0。
5. 如果当前背包重量加上该物品的重量大于背包容量 W,则只能装入该物品的一部分,计算出装入该物品的最大比例 r,将 res 数组对应位置赋值为 r。
6. 将背包重量加上装入该物品的重量乘以比例 r。
7. 结束遍历后,返回 res 数组作为装入物品的对应指示向量。
相关问题
vector<vector<int>>& mat 如何访问元素
访问二维整数向量中的元素可以使用双重下标访问,即 mat[i][j] 表示访问第 i 行第 j 列的元素。其中,i 和 j 分别代表行号和列号,从 0 开始计数。
例如,访问 mat 中第二行第三列的元素可以使用 mat[1][2]。
另外,也可以使用迭代器来访问二维整数向量中的元素,例如:
```c++
for (auto it = mat.begin(); it != mat.end(); ++it) {
vector<int>& row = *it;
for (auto jt = row.begin(); jt != row.end(); ++jt) {
int& val = *jt;
// 对 val 进行操作
}
}
```
这里使用 auto 关键字和迭代器访问二维整数向量中的每个元素,其中 it 代表指向行的迭代器,row 代表指向一个行向量的引用,jt 代表指向列的迭代器,val 代表指向元素的引用。
vector< vector<int> >怎么设置初值
你可以使用以下方式来设置 `vector< vector<int> >` 的初值:
```c++
// 设置一个大小为 m * n 的二维 vector,初值为 val
int m = 3, n = 4, val = 0;
std::vector<std::vector<int> > vec(m, std::vector<int>(n, val));
```
这将会创建一个大小为 `m * n` 的二维 vector,其中每一个元素的初值都为 `val`。你也可以将 `val` 替换成其他你所需要的初值。