实验四 贪心算法

本文介绍了如何使用C++编程语言实现背包问题的贪心算法,包括0-1背包问题的变体,以及如何通过贪心策略解决最优服务次序问题以最小化平均等待时间。通过实例展示了两种算法的实现步骤和运行结果。
摘要由CSDN通过智能技术生成

一、实验目的与要求

1、熟悉背包问题;

2、掌握动态规划算法和贪心算法;

3、能对设计的算法进行复杂度分析。

  • 实验题目

背包问题。 给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大?与0-1背包问题类似,所不同的是在选择物品i装入背包时,可以选择物品i的一部分( 0≤xi ≤1) ,而不一定要全部装入背包,1≤i≤n。

选做题:

最优服务次序问题。设有n个顾客同时等待一项服务,顾客i需要的服务时间为ti,应如何安排n个顾客的服务次序才能使平均等待时间达到最小?平均等待时间是n个顾客等待服务时间的总和除以n。用C/C++实现该算法。

三、实验步骤

1、算法思想描述

    贪心算法的特点是每个阶段所做的选择都是局部最优的,它期望通过所做的局部最优选择产生出一个全局最优解。

2、实现的程序代码

#include<bits/stdc++.h>

using namespace std;

void Sort(int n,double w[],double v[])

{

int i,j;

float temp1,temp2;

for(i=1;i<=n;i++)

{

for(j=1;j=n-1;j++)

{

temp1=v[j]/w[j];

temp1=v[j+1]/w[j+1];

if(temp1<temp2)

{

swap(w[j],w[j+1]);

swap(v[j],v[j+1]);

}

}

}

}

void Sort1(int n,double w[],double v[])

{

int max1;

double t[20];

for(int i=1;i<=n;i++)

{

t[i]=v[i]/w[i];

}

for(int i=1;i<=n;i++)

{

max1=i;

for(int j=i+1;j<=n;j++)

{

if(t[j]>t[max1])

{

max1=j;

}

}

swap(t[i],t[max1]);

swap(w[i],w[max1]);

swap(v[i],v[max1]);

}

for(int i=1;i<=n;i++)

{

cout<<t[i]<<endl;

}

}

void knapsack_greedy(int n,double c,double w[],double v[],double b[]){

int j;

    //Sort1(n,w,v);

Sort1(n,w,v);

for(int i=1;i<=n;i++)//初始化背包b[]

b[i]=0;

for(j=1;j<=n;j++){

if(c<w[j]) break;

b[j]=1;

c=c-w[j];

}

if(j<=n)

b[j]=c/w[j];

cout<<"输出:"<<endl;

for(int i=1;i<=n;i++){

cout<<"物品重量为:"<<w[i]<<" "<<"物品比例"<<b[i]<<endl;

}

}

int main()

{

int n,c;

double b[20],w[20],v[20];

cout<<"输入物品数量和背包容量:";

cin>>n>>c;

cout<<"输入物品重量(如:30 10 20):";

for(int i=1;i<=n;i++)

cin>>w[i];

cout<<"输入物品的价值(如:120 60 100):";

for(int i=1;i<=n;i++)

cin>>v[i];

knapsack_greedy(n,c,w,v,b);

return 0;

}

  1. 运行结果图

选做题

1、算法思想描述

   一般是按照从小到大的顺序进行排列,然后在进行依次算出等待时间,如果不止一个服务地点则进行循环算出每一个窗口的等待时间即可。

2、实现的程序代码

#include <iostream>

#include <algorithm>

#include <iomanip>

using namespace std;

int main()

{

 int n,i,sum1,sum2;

 double ave;

 sum1=0;

 sum2=0;

 double *a;

 cout<<"请输入顾客的数量n:";

 cin>>n;

 a = (double *)malloc(sizeof(double)*n);

 cout<<"每个顾客的需要服务的时间:"<<endl;

 for(i=0;i<n;i++)

  cin>>a[i];

 sort(a,a+n);

 for(i=0;i<n-1;i++)

 {

  sum1=sum1+a[i];

  sum2=sum2+sum1;

 }

 ave=sum2/n;

 cout<<setiosflags(ios::fixed)<<setprecision(2)<<"最小平均等待时间:"<<ave<<endl;

 return 0;

}

3、运行结果图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值