📜  门|门 IT 2005 |第 31 题(1)

📅  最后修改于: 2023-12-03 14:58:35.610000             🧑  作者: Mango

门|门 IT 2005 |第 31 题

该题目是一个经典的贪心算法问题,需要根据题目描述实现代码,并返回最优解。该问题可以通过贪心策略解决。

题目描述

题目要求从一组物品中选择尽可能多的物品,使得这些物品的总重量不超过背包的容量。

  • 输入:N, V (0 <= N, V <= 1000) 分别表示物品数量和背包容量,接下来N行,每行包含两个整数:v 和 w,表示物品的重量和价值。
  • 输出:选择物品的最大价值
题目分析
解题思路

使用贪心算法,思路如下:

  1. 按照物品的价值重量比进行排序;
  2. 从价值重量比高的开始选取物品,直到剩余背包容量无法再选为止。
时间复杂度

排序:O(nlogn)

选择物品:O(n)

所以总时间复杂度为:O(nlogn)

空间复杂度

由于使用了一个数组进行排序,所以空间复杂度为: O(n)

参考代码
#include <iostream>
#include <algorithm>
using namespace std;

struct Object {
    int weight, value;
    double ratio; // used to sort objects
};

bool cmp(Object a, Object b) {
    return a.ratio > b.ratio;
}

int main() {
    int n, v;
    cin >> n >> v;
    Object *objects = new Object[n];
    for (int i = 0; i < n; i++) {
        cin >> objects[i].weight >> objects[i].value;
        objects[i].ratio = (double)objects[i].value / objects[i].weight; // calculate the ratio
    }
    sort(objects, objects + n, cmp);
    int ans = 0, c = 0;
    for (int i = 0; i < n; i++) {
        if (c + objects[i].weight <= v) {
            c += objects[i].weight;
            ans += objects[i].value;
        }
        else {
            int r = v - c;
            ans += (int)(r * objects[i].ratio);
            break;
        }
    }
    cout << ans << endl;
    delete[] objects;
    return 0;
}

该代码使用了结构体来存储物品信息,通过重载cmp函数实现了按照物品的价值重量比进行排序,然后使用贪心策略选择物品,最后输出选择物品的最大价值。

以上是本题题解,如有疑问,欢迎在评论区留言。