一、实验目的与要求
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、算法思想描述
一般是按照从小到大的顺序进行排列,然后在进行依次算出等待时间,如果不止一个服务地点则进行循环算出每一个窗口的等待时间即可。
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、运行结果图