C++ 贪心算法求解背包问题:最大价值金币
\u003cp\u003e贪心算法是一种通过每一步的局部最优选择来达到全局最优解的算法。在这个问题中,我们可以使用贪心算法来解决。\u003c/p\u003e\n\u003cp\u003e首先,我们将所有的金币按照单位价格(价值\u002f重量)从大到小排序。然后,我们从单位价格最高的金币开始,尽可能地装满背包。\u003c/p\u003e\n\u003cp\u003e具体的实现步骤如下:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e将所有的金币按照单位价格从大到小排序。\u003c/li\u003e\n\u003cli\u003e初始化当前背包的总重量为0,总价值为0。\u003c/li\u003e\n\u003cli\u003e遍历排序后的金币列表,对于每一个金币:\u003c/li\u003e\n\u003cul\u003e\n\u003cli\u003e如果当前背包的总重量加上当前金币的重量小于等于背包的承重量,那么将当前金币全部装入背包,更新当前背包的总重量和总价值。\u003c/li\u003e\n\u003cli\u003e否则,将背包剩余的容量用当前金币的单位重量装满,更新当前背包的总重量和总价值。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cli\u003e返回当前背包的总价值。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e下面是具体的C++代码实现:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e#include \u003ciostream\u003e\n#include \u003cvector\u003e\n#include \u003calgorithm\u003e\n\nusing namespace std;\n\nstruct Coin {\n int weight;\n int value;\n double unitPrice;\n};\n\nbool cmp(const Coin\u0026 a, const Coin\u0026 b) {\n return a.unitPrice \u003e b.unitPrice;\n}\n\ndouble getMaxValue(vector\u003cCoin\u003e\u0026 coins, int capacity) {\n double maxValue = 0.0;\n sort(coins.begin(), coins.end(), cmp);\n \n for (int i = 0; i \u003c coins.size(); i++) {\n if (capacity \u003e= coins[i].weight) {\n maxValue += coins[i].value;\n capacity -= coins[i].weight;\n } else {\n maxValue += coins[i].unitPrice * capacity;\n break;\n }\n }\n \n return maxValue;\n}\n\nint main() {\n int N, T;\n cin \u003e\u003e N \u003e\u003e T;\n \n vector\u003cCoin\u003e coins(N);\n for (int i = 0; i \u003c N; i++) {\n cin \u003e\u003e coins[i].weight \u003e\u003e coins[i].value;\n coins[i].unitPrice = coins[i].value * 1.0 \u002f coins[i].weight;\n }\n \n double maxValue = getMaxValue(coins, T);\n cout \u003c\u003c maxValue \u003c\u003c endl;\n \n return 0;\n}\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e输入样例:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e3 50\n10 60\n20 100\n30 120\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e输出样例:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e240\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e在这个例子中,阿里巴巴有一个承重量为50的背包,有三堆金币,分别是10kg重的60价值的金币,20kg重的100价值的金币,30kg重的120价值的金币。由于背包的承重量为50,我们可以装入30kg的金币和20kg的金币,总价值为240。\u003c/p\u003e
原文地址: https://www.cveoy.top/t/topic/pLlq 著作权归作者所有。请勿转载和采集!