贪心思想之部分背包算法

贪心的思想:通过每一步都找最优解决问题。因为每一步最优,最后是最优的概率很大。

部分背包的思想就是:把最值钱的往包里装,装得越多越好。可见设计算法的人好贪啊,嘿嘿~

样例:

n种东西,重量是Mi,价值是Vi,单价就是两者之比Pi。C为小包包的容量。最后算出的结果是对应取Xi放到包中。

代码如下:

#include<iostream>
using namespace std;

float *m,*v,*p,*x;
float c;//背包容量
int n,h;

void TaskInitial();
void result_out();

void Greedy_beibao();
void calculate_p();
int find_next_big_p(int);
void load_beibao(int);

int main()
{	
	TaskInitial();
	Greedy_beibao();
	result_out();
	return 0;
}

/*基本输入输出*/
void TaskInitial()
{
	cin>>c;//背包容量
	cin>>n;//物品种类
	m=(float *)malloc(n*sizeof(float));//存物品质量
	v=(float *)malloc(n*sizeof(float));//存物品对应总价值
	p=(float *)malloc(n*sizeof(float));//存放物品单价
	x=(float *)malloc(n*sizeof(float));//存 放入背包的物品的数量
	for(int i=0;i<n;i++)	
	{
		cin>>*(m+i)>>*(v+i);
		*(p+i)=(*(v+i))/(*(m+i));
		*(x+i)=0;
	}
}
void result_out()
{
	float totalval=0;
	for(int i=0;i<n;i++)
	{
		cout<<*(x+i)<<endl;
		totalval+=((*(v+i))/(*(m+i)))*(*(x+i));
	}
	cout<<"总价值:"<<totalval<<endl;
}

/*贪心算法*/
void Greedy_beibao()
{
	h=1;	
	load_beibao(find_next_big_p(h));
}
int find_next_big_p(int i)
{
	float tempdata;
	int k=0;
	for(int j=0;j<n;j++)
		if(*(p+j)>*(p+k))
			k=j;
	*(p+k)=0;
	return k;
}
void load_beibao(int k) 
{
	if(c<=*(m+k))
		*(x+k)=c;
	else
	{
		*(x+k)=*(m+k);
		c-=*(m+k);
		h++;
		if(h<=n)
			load_beibao(find_next_big_p(h));
	}
}

  测试一下吧:

部分背包问题暂时搞定,继续!

posted @ 2014-10-22 17:01  liu_ty10  阅读(346)  评论(0编辑  收藏  举报