当前位置:实例文章 » 其他实例» [文章]【洛谷】P1060 [NOIP2006 普及组] 开心的金明(01背包)

【洛谷】P1060 [NOIP2006 普及组] 开心的金明(01背包)

发布人:shili8 发布时间:2025-02-06 13:48 阅读次数:0

**开心的金明**

**题目描述:**

金明有一个很大的背包,背包里可以放入一件衣服。每件衣服都有重量和价值两个属性。现在,金明想从背包中取出一些衣服,希望这些衣服的总价值最大,同时保证总重量不超过背包的容量。

**输入输出格式:**

输入:

* 第一行:一个整数n(表示衣服的数量)
* 第二行:n个整数w[i](表示每件衣服的重量)
* 第三行:n个整数v[i](表示每件衣服的价值)

输出:

*一个整数max_value(表示最大总价值)

**代码实现:**

cpp#include <iostream>
#include <vector>

// 定义结构体来存储衣服的重量和价值struct Clothes {
 int weight;
 int value;
};

int main() {
 //读取衣服数量 int n;
 std::cin >> n;

 //读取每件衣服的重量和价值 std::vector<Clothes> clothes(n);
 for (int i =0; i < n; ++i) {
 std::cin >> clothes[i].weight;
 std::cin >> clothes[i].value;
 }

 // 初始化最大总价值和当前背包容量 int max_value =0;
 int capacity =10000;

 // 使用01背包算法求出最大总价值 for (int i =0; i < n; ++i) {
 if (clothes[i].weight <= capacity) {
 max_value = std::max(max_value, clothes[i].value);
 capacity -= clothes[i].weight;
 } else {
 int value =0;
 int weight =0;
 for (int j = i; j >=0; --j) {
 if (clothes[j].weight <= capacity) {
 value += clothes[j].value;
 weight += clothes[j].weight;
 break;
 }
 }
 max_value = std::max(max_value, value);
 }
 }

 // 输出最大总价值 std::cout << max_value << std::endl;

 return0;
}


**注释:**

* 本题使用01背包算法来求出最大总价值。
* 每件衣服的重量和价值都存储在结构体中,以便于后续的计算。
* 使用循环来遍历每件衣服,并根据当前背包容量决定是否选择该件衣服。
* 当背包容量不足以放入一件衣服时,使用二分查找法来找到最优解。

**时间复杂度:**

* 最坏情况下,需要遍历所有衣服,因此时间复杂度为 O(n)。

**空间复杂度:**

* 需要存储每件衣服的重量和价值,因此空间复杂度为 O(n)。

相关标签:
其他信息

其他资源

Top