貪心法求解揹包問題(物品可分)

/**
* @file					Greedy2Knapsack.cpp
* @brief				solve Knapsack with "per pound value"'s way
* @author				taoxiaoxiao
* @date					11-3-2014
*/
//輸入實例 W=50 v=[60,150,150] w=[10,20,50]  
//該算法求解部分揹包(物品可分)  
//該算法每次選擇單位重量價值最大的物品(最優解) 

#include <iostream>
#include <algorithm>
#define N 3
using namespace std;

int v[N], w[N];
double pvalue[N], x[N];
int W = 50;

void sort(int v[], int w[])
{
	int tmp1, tmp2;
	int i, j;

	for (i = 0; i < N; ++i)
		pvalue[i] = double(v[i] / w[i]);
	for (i = 0; i < N - 1; ++i)
	{
		int k = i;
		for (j = i + 1; j < N; ++j)
		{
			if (pvalue[j] > pvalue[k])
				k = j;
		}
		if (k != i)
		{
			tmp1 = v[i], tmp2 = w[i];
			v[i] = v[k], w[i] = w[k];
			v[k] = tmp1, w[k] = tmp2;
		}
	}
}
void Greedy2Knapsack()
{
	int i;
	for (i = 0; i < N; ++i)
	{
		if (w[i]>W)
			break;
		x[i] = 1;
		W -= w[i];
	}
	if (i <= N)
		x[i] =double (W) / w[i];
}
int main()
{
	int i;
	double max_value=0.0;

	for (i = 0; i < N; ++i)
		cin >> v[i];
	for (i = 0; i < N; ++i)
		cin >> w[i];
	sort(v, w);
	Greedy2Knapsack();
	for (i = 0; i < N; ++i)
	{
		if (x[i] > 0)
			cout << "[" << v[i] << "," << w[i] << "]"
					<< "放入" << x[i] << "件" << endl;
		max_value += x[i] * v[i];
	}
	cout << "最大價值爲:" << max_value << endl;

	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章