关闭

Knapsack problem I

标签: Knapsack with dynami
182人阅读 评论(0) 收藏 举报
分类:
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <Windows.h>

using namespace std;

// given n objects and a knapsack with capacity limit W
// object i weigts wi > 0 and has value vi > 0
// Goal: fill knapsack that max total value of objects

struct Item
{
	int value;
	int weight;
};

bool operator<(const Item &lhs, const Item &rhs)
{
	return lhs.weight < rhs.weight;
}

// O(n*W) time complexity

int Knapsack(vector<Item> items, int W, vector<Item> &solution)
{
	int n = static_cast<int>(items.size());
	sort(items.begin(), items.end());
	vector<vector<int>> M(n + 1, vector<int>(W + 1, 0));

	for (int i = 1; i <= n; ++i)
	{
		for (int w = 0; w <= W; ++w)
		{
			if (items[i - 1].weight > w)
				M[i][w] = M[i - 1][w];
			else
				M[i][w] = max(M[i - 1][w], items[i - 1].value + M[i - 1][w - items[i - 1].weight]);
		}
	}

	int i = n, w = W;
	while (i >= 0 && w > 0)
	{
		if (M[i][w] > M[i - 1][w])
		{
			solution.push_back(items[i - 1]);
			w -= items[i - 1].weight;
		}
		--i;
	}

	return M[n].back();
}
int main()
{
	vector<Item> items{ {1, 1}, {6, 2}, {18, 5}, {28, 7}, {22, 6} };
	vector<Item> solution;
	cout << "Max profit: " << Knapsack(items, 11, solution) << endl;
	cout << "Items: " << endl;
	for (auto a : solution)
		cout << a.value << " " << a.weight << endl;
	system("PAUSE");
	return 0;
}

Reference:

http://www.cs.princeton.edu/~wayne/kleinberg-tardos/pdf/06DynamicProgrammingI.pdf

0
0
查看评论

0-1背包问题(knapsack problem)

c[i][w]表示背包容量为w时,i个物品导致的最优解的总价值。递归定义如下              0      ...
  • skillart
  • skillart
  • 2012-06-10 20:05
  • 3448

The Knapsack problem Gym - 101064L

D - The Knapsack problem  Gym - 101064L  题意:给定背包可容纳总重量S和n种物品,每种物品有自己的重量w和价值c,每种物品能使用多次,问背包能装物品的最大价值是多少。 这题是队内训练的时候做的,当时一看,这不是裸的完全背包么,大水题...
  • lxy767087094
  • lxy767087094
  • 2017-03-09 23:30
  • 227

算法/贪心算法/FractionalKnapsack部分背包问题

算法/贪心算法/FractionalKnapsack部分背包问题 问题描述 给定N个物品和一个背包,物品i的质量是Wi,其价值位Vi,背包的容量为C,问应该如何选择装入背包的物品,使得转入背包的物品的总价值为最大? 与0-1背包不同的是在选择物品的时候,每个商品可以只装该商品的一部分。 ...
  • Carinya
  • Carinya
  • 2017-04-24 18:46
  • 327

背包问题(Knapsack problem)

这是一类经典的算法问题。 问题可以描述为: 给定一组物品 x(1, n), 每个具有重量 w(1, n) 和价值 v(1, n), 如何从这组物品里选择一个子集合,使得这个子集合的元素在满足总重量 w 小于或等于给定的重量W的条件下,总价值 V 最大。 通用的算法是使用递归来求解。 V(i, ...
  • CaspianSea
  • CaspianSea
  • 2015-03-27 08:03
  • 1200

第六届福建省大学生程序设计竞赛-重现赛,Problem C Knapsack problem【大背包】

Problem C Knapsack problem Accept: 83    Submit: 457 Time Limit: 3000 mSec    Memory Limit : 32768 KB ...
  • liu6886
  • liu6886
  • 2015-12-28 16:04
  • 714

0-1背包问题和部分背包(fractional knapsack)问题分析

简介     背包问题已经是一个很经典而且讨论很广泛的算法问题了。最近学习到这一部分,打算结合自己思考和编码的过程做一个思考总结。这里主要讨论的0-1背包问题和部分背包问题解决方法背后其实隐藏了两种我们比较常见的算法解决思路,动态规划和贪婪算法。正好通过这两个问题的讨论可以好好...
  • u013078669
  • u013078669
  • 2016-03-29 15:28
  • 866

FZU 2214 Knapsack problem 01背包变形

FZU 2214 Knapsack problem 01背包变形 数组越界处理 变量互换
  • qq_26071477
  • qq_26071477
  • 2016-08-20 23:23
  • 294

knapsack problems(背包问题)

背包问题定义我们有nn种物品,物品jj的重量为wjw_j,价格为pjp_j。 我们假定所有物品的重量和价格都是非负的。背包所能承受的最大重量为W。 如果限定每种物品只能选择0个或1个,则问题称为0-1背包问题 可以用公式表示为: 最大化:∑nj=1xjpj\sum_{j=1}^{n}x_jp...
  • selous
  • selous
  • 2017-02-16 20:07
  • 344

动态规划 (Dynamic Programming) 之 背包问题合辑 (Knapsack, Subset Sum, Partition and change making problem )

背包问题一直是动态规划中的经典问题。这个问题又分成01背包,完全背包,多重背包,分组背包等等。。我在这里只记录下01背包(0-1knapsack)和完全背包(unbounded knapsack)。背包问题的简单描述就是有一个背包和一堆物品。每个物品有自己的大小和价值。我们希望在一个特定容量的背包中...
  • hhygcy
  • hhygcy
  • 2009-03-04 11:02
  • 16142

动态规划之01背包问题(Knapsacks Problem)

背包问题 一、01背包问题
  • Netown_Ethereal
  • Netown_Ethereal
  • 2014-04-30 18:09
  • 2024
    个人资料
    • 访问:13590次
    • 积分:735
    • 等级:
    • 排名:千里之外
    • 原创:61篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    文章分类