列出了物品列表,每件物品都有自己的值和重量。物品可以放在最大重量限制为W的背包中。问题是要找到小于或等于W的重量,并且值要最大化。
背包问题有两种。
0 – 1背包
小背包
对于0 – 1背包,不能将物品分成小块,对于小背包,可以将物品分成小块。
在这里,我们将讨论分数背包问题。
该算法的时间复杂度为O(n Log n)。
Input: Maximum weight = 50. List of items with value and weight. {(60, 10), (100, 20), (120, 30)} Output: Maximum value: 240 By taking the items of weight 20 and 30
fractionalKnapsack(weight, itemList, n)
输入- 背包的最大重量,物品列表和物品数量
输出: 获得的最大值。
Begin sort the item list based on the ration of value and weight currentWeight := 0 knapsackVal := 0 for all items i in the list do if currentWeight + weight of item[i] < weight then currentWeight := currentWeight + weight of item[i] knapsackVal := knapsackVal + value of item[i] else remaining := weight – currentWeight knapsackVal “= knapsackVal + value of item[i] * (remaining/weight of item[i]) break the loop done End
#include <iostream> #include<algorithm> using namespace std; struct item { int value, weight; }; bool cmp(struct item a, struct item b) { //compare item a and item b based on the ration of value and weight double aRatio = (double)a.value / a.weight; double bRatio = (double)b.value / b.weight; return aRatio > bRatio; } double fractionalKnapsack(int weight, item itemList[], int n) { sort(itemList, itemList + n, cmp); //sort item list using compare function int currWeight = 0; // Current weight in knapsack double knapsackVal = 0.0; for (int i = 0; i < n; i++) { //check through all items if (currWeight + itemList[i].weight <= weight) { //when the space is enough for selected item, add it currWeight += itemList[i].weight; knapsackVal += itemList[i].value; }else{ //when no place for whole item, break it into smaller parts int remaining = weight - currWeight; knapsackVal += itemList[i].value * ((double) remaining / itemList[i].weight); break; } } return knapsackVal; } int main() { int weight = 50; // Weight of knapsack item itemList[] = {{60, 10}, {100, 20}, {120, 30}}; int n = 3; cout << "Maximum value: " << fractionalKnapsack(weight, itemList, n); }
输出结果
Maximum value: 240
主要内容:动态规划解决01背包问题,01背包问题的具体实现商店的货架上摆放着不同重量和价值的商品,一个小偷在商店行窃,他携带的背包只能装固定重量的商品。装哪些商品才能获得最大的收益呢?在限定条件内找到最佳的物品组合,这样的问题统称为背包问题。 根据限定的条件不同,背包问题还可以细分: 部分背包问题:所有物品是可再分的,即允许将某件物品的一部分(例如 1/3)放入背包; 0-1 背包问题:所有物品不可再分,要么整个装入背包,要么放弃,不允许出现“仅选择物品
主要内容:贪心算法解决部分背包问题在限定条件下,如何从众多物品中选出收益最高的几件物品,这样的问题就称为背包问题。 图 1 背包问题 举个简单的例子,商店的货架上摆放着不同重量和价值的商品,一个小偷在商店行窃,他携带的背包只能装固定重量的商品,选择哪些商品才能获得最大的收益呢?这个问题就属于背包问题,限定条件是背包的承重,最终目标是令背包中存放的物品的总收益最高。 根据不同的限定条件,背包问题还可以有更细致的划分: 0-1 背
我应该如何尽可能有效地实现这个算法?贪婪的选择不起作用,所以我是否应该修改原始的动态编程解决方案来适应这个问题?如果是,怎么做? 如果有关系的话,我打算用Java写这个。
问题 你面前摆放着 n 个珠宝(共 n 种,每种 1 个),已知珠宝 s_i 的价值是 v_i ,重量是 w_i 。给你一个背包,你可以自由挑选珠宝装到背包中,但背包可以装载的最大重量为 t 。求背包能够装载珠宝的最大价值 v 。 解法 设 f(i,j) 为背包中放入前 i 件物品,重量不大于 j 的最大价值,其中 i in [1,n] , j in [0,t] 。有如下状态转移方程: f(i,j
我有一个场景,我需要一些帮助来制定问题,这样我才能正确地实施优化方法。我希望有人能给我一些指导,表面上看起来很简单,但我很难弄清楚如何正确编码变量、约束等。 情况是这样的: 需要将多个物品放入箱子/背包中 例: 每个项目有两个值的向量: 项目=[[7,6],[14,2],[27,23],[5,15]] 箱子/背包的向量,第一个值为物品第一个值可接受的上限。第二个值相同,但适用于箱子/背包中每个物品
问题 你面前摆放着 n 个珠宝(共 n 种,每种 1 个),这些珠宝被分成 m 个组(显然 n geq m )。已知珠宝 s_i 的价值是 v_i ,重量是 w_i 。给你一个背包,你可以挑选珠宝装到背包中,但背包可以装载的最大重量为 t ,并且同一个组的珠宝至多只能选择 1 个。求背包能够装载珠宝的最大价值 v 。 该问题与01背包的区别就是,对珠宝进行了分组,并且一个组内的珠宝互斥。 解法 设