【洛谷】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)。