您的位置:首页 > 其它

贪心背包问题

2013-04-11 23:28 134 查看


Problem Description

有一个背包,背包容量是M=150。有7个物品,物品可以分割成任意大小。

要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。

物品 A B C D E F G

重量 35 30 60 50 40 10 25

价值 10 40 30 50 35 40 30

分析:

目标函数: ∑pi最大

约束条件是装入的物品总重量不超过背包容量:∑wi<=M( M=150)


Input

首先输入一个正整数T,表示有T组测试数据,接下来是T组数据,每组两行,分别为7个物品的重量和价值。


Output

每组数据的背包能装的最大总价值,精确到小数点后三位。


Sample Input

1	
35  30  60  50  40  10  25
10  40  30  50  35  40  30






Sample Output

190.625



分析:题目比较简单,就直接码代码了。一般来说,贪心算法的证明围绕着:整个问题的最优解一定由在贪心策略中存在的子问题的最优解得来的。


Code:
#include<iostream>
#include <iomanip> 
using namespace std;
void sort(float a[],float b[],float c[],int n)
{
	for(int d = n/2;d >= 1;d = d/2)
	{
		for(int i = d + 1;i <= n;i++)
		{
			a[0] = a[i];
			b[0] = b[i];
			c[0] = c[i];
			for(int j = i - d;j > 0&&a[0] < a[j];j = j - d)
			{
				a[j + d] = a[j];
				b[j + d] = b[j];
				c[j + d] = c[j];
			}
			a[j + d] = a[0];
			b[j + d] = b[0];
			c[j + d] = c[0];
		}
	}
}
float getSum(float a[],int n)
{
	float sum = 0;
	for(int i = n;i <= 7;i++)
		sum = sum + a[i];
	return sum;
}
int main()
{
	int n;
	cin>>n;
	while(n--)
	{
		int i,j,k;
		float sum=0;
		float zl[8],jz[8],xjb[8];
		for(i = 1;i < 8;i++)
			cin>>zl[i];
		for(j = 1;j < 8;j++)
			cin>>jz[j];
		for(k = 1;k < 8;k++)
			xjb[k] = jz[k]/zl[k];
		sort(xjb,zl,jz,7);
		int temp = 7;
		while(getSum(zl,temp) <= 150)
			temp--;
		for(int t = 7;t > temp;t--)
			sum = sum + jz[t];
		sum = sum + (150 - getSum(zl,temp + 1)) / zl[temp] * jz[temp];
		cout<<setiosflags(ios::fixed)<<setprecision (3)<<sum<<endl;
	}
	return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: