贪心算法——背包问题

14天阅读挑战赛

目录

1.题目描述     

2.问题分析

3.算法设计

4.C++程序

5.算法复杂度及优化

5.1算法复杂度分析

5.2算法优化扩展


1.题目描述     

        有n种物品,每种物品只有一个,第i种物品的重量为w_{i},价值为v_{i},背包的容量为W,物品可以分割。如何放置物品,使得背包的物品价值最大?

i个物品重量及其价值如下:

物品清单
物品i 1 2 3 4 5 6 7 8 9 10
重量w_{i} 4 2 9 5 5 8 5 4 5 5
价值v_{i} 3 8 18 6 8 20 5 6 7 15

2.问题分析

        由于物品可以分割,贪心策略选择单位重量价值最大的物品装入背包最为合适。所以在选择过程中需要将物品按照单位重量价值递减的顺序进行排序,以此取前面单位重量价值最大的物品。

3.算法设计

        1)将物品的重量、价值和单位重量价值定义为一种结构体类型,方便对其按照单位重量价值从大到小进行排序。

        2)根据贪心算法策略,以此取单位重量价值的最大物品存入背包中,直至背包填满,如果到达第i个物品时超出了背包容量,那么就取该物品其中的一部分放入背包中。

4.C++程序

#include
#include
using namespace std;

struct item {
	double w;//物品重量
	double v;//物品价值
	double p;//物品单位重量价值(价值/重量)
};
bool cmp(item a, item b) {
	return a.p > b.p;
}
item s[1000];
int main() {
	int n;
	double sum = 0,w,wleft;
	wleft = w;
	cin >> w>>n;
	for (int i = 0; i < n; i++) {
		cin >> s[i].w >> s[i].v;
		s[i].p = s[i].v / s[i].w;
	}
	sort(s, s + n, cmp);
	for (int i = 0; i < n; i++) {
		if (s[i].w <= wleft) {
			wleft -= s[i].w;
			sum += s[i].v;
		}
		else {
			sum += wleft * s[i].p;
			break;
		}
	}
	system("pause");
	return 0;
}

5.算法复杂度及优化

5.1算法复杂度分析

        (1)时间复杂度:程序运行时间主要耗费在对物品按照单位重量价值排序上,采用的C++头文件algorithm中的sort方法,此方法采用快速排序,时间复杂度为O(n\log n)。

        (2)空间复杂度:空间主要耗费在对物品的存储上。空间复杂度为O(定义数组的大小)。

5.2算法优化扩展

        如果物品不可分割,那么使用该贪心算法是否可以得到最优解呢?

        物品可分割的背包问题称为背包问题,物品不可分割的背包问题称为0/1背包问题。0/1背包问题已经不具备贪心选择的性质,并不能通过局部最优达到全局最优。

你可能感兴趣的:(算法与数据结构,算法,c++,贪心算法)