用贪心算法求解背包问题

实验名称
用贪心算法求解背包问题。

实验目的
通过上机实验,用贪心算法求解背包问题。

实验原理
使用贪心算法,根据不同的输入用例,能准确的输出最优值,并计算出程序运行所需要的时间。

实验步骤
①首先计算每种物品单位重量的价值vi/wi,按单位价值重量进行升序排序
②然后根据贪心算法,将尽可能多的单位重量价值最高的物品装入背包,若将这种物品全部装入背包后,背包内的物品总重量未超过C,则选择单位重量价值次高的物品尽可能多地装入背包。
③按照以上策略,一直进行下去,知道背包装满为止

时间复杂度分析
该算法具体实现中们主要的计算时间在于调用sort函数,因此算法的时间复杂度为:O(nlogn)。

实验心得
通过这次实验,我回顾了贪心算法。

#include
#include
#include 
#include
#include 
#include
using namespace std; 
struct Goods
{
    int weight;
    int value;
    float P;//权重=价值/重量 
    float N;//物品装入背包的部分,如果全部装入则为1,装入一半为0.5 
};
bool compare (Goods &a,Goods &b)
{
    return a.P>b.P;
}
void Greedy(Goods goods[],int n, int c)
{
    for(int i=0; igoods[i].weight)
        {
            c-=goods[i].weight;
            goods[i].N=1;//如果背包足够装下整个物品,该物品全部装入记为1 
        }
        else if(c>0)
		{//如果背包不足以装下整个物品,就装入物品的一部分 
            goods[i].N=c/(goods[i].weight*1.0);//计算物品装入背包的部分
            c=0; 
        }
    }
}
void creatrand(int m) 
{
	ofstream f_out;
	f_out.open("input.txt", ios::out);
	srand(time(NULL));
	int r,s;
	for ( int i = 0; i < m; i++)
	 {
		r =rand()%(10-1)+1;
		s = rand()%(10-1)+1;
		f_out << r << " "<>v;
    cout<<"请输入物品的数量:"<>n;
    Goods goods[n];
    creatrand(n);
    cout<<"请分别输入物品的重量和价值:"<>goods[i].weight>>goods[i].value;//输入重量和价值 
        cout<< goods[i].weight<<" "<

你可能感兴趣的:(算法分析与设计,c++)