1.活动安排问题:
有n个活动,其开始时间,结束时间已知,问怎么安排可以尽可能排最多的活动
/*
活动安排问题
*/
#include<iostream>
using namespace std;
#define MAXNUM 20
int n;//活动的个数
int start[MAXNUM];//活动的开始时间
int finish[MAXNUM];//活动的结束时间
bool A[MAXNUM]={0};//活动的选择向量={(1,0)}
int Count=1;
void input()
{
cout<<"请输入活动的个数:"<<endl;
cin>>n;
cout<<"请依次输入这些活动的开始时间:"<<endl;
for(int i=1;i<=n;i++)
cin>>start[i];
cout<<"请依次输入这些活动的结束时间,按照从小到大的顺序."<<endl;
for(int i=1;i<=n;i++)
cin>>finish[i];
}
int SelectAct()
{
int j=1;
A[1]=true;//第一个活动结束时间最早,将它加入集合A
for(int i=2;i<=n;i++)
{
if(start[i]>=finish[j])
{
A[i]=true;
j=i;
Count++;
}
else
{
A[i]=false;
}
}
return Count;
}
int main()
{
input();
cout<<"可安排的活动数量为:"<<SelectAct()<<endl;
cout<<"=====活动向量====="<<endl<<"(";
for(int i=1;i<=n;i++)
cout<<A[i]<<",";
cout<<")"<<endl;
system("pause");
return 0;
}
输入:
n=11
Start={1,3,0,5,3,5,6,8,8,2,12}
Finish={4,5,6,7,8,9,10,11,12,13,14}
输出:
Count=4
A={1,0,0,1,0,0,0,1,0,0,0,0,0,1}
2.背包问题(一般背包问题):
与0-1背包问题的区别就是选择向量可以取分数。
关键:按照物品的性价比排序。
/*
背包问题
*/
#include<iostream>
using namespace std;
#define MAX 20
int n;//物品个数
int W;//背包容量
float w[MAX];//物品重量
float v[MAX];//物品价值
float item[MAX]={0.0};//物品选择向量
float Value=0.0;
void input()
{
cout<<"请输入物品的个数:"<<endl;
cin>>n;
cout<<"请输入背包的容量:"<<endl;
cin>>W;
cout<<"请依次输入物品的重量:"<<endl;
for(int i=0;i<n;i++)
cin>>w[i];
cout<<"请依次输入物品的价值:"<<endl;
for(int i=0;i<n;i++)
cin>>v[i];
}
void Sort()
{
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-1-i;j++)
{
if((v[j]/w[j])<=(v[j+1]/w[j+1]))
{
swap(w[j],w[j+1]);
swap(v[j],v[j+1]);
}
}
}
}
float Knapscak()
{
Sort();
int current_weight=W;
int i;
for(i=0;i<n;i++)
{
if(w[i]>current_weight)
{
break;
}
else
{
item[i]=1;
current_weight-=w[i];
Value+=v[i];
}
}
if(i<n)
{
item[i]=float(current_weight/w[i]);
Value+=item[i]*v[i];
}
return Value;
}
int main()
{
input();
Sort();
cout<<"=====按照物品性价比进行排序(由大到小)====="<<endl;
for(int i=0;i<n;i++)
cout<<w[i]<<" ";
cout<<endl;
for(int i=0;i<n;i++)
cout<<v[i]<<" ";
cout<<endl;
cout<<"最大价值:"<<Knapscak()<<endl;
cout<<"(";
for(int i=0;i<n;i++)
cout<<item[i]<<" ";
cout<<")";
cout<<endl;
system("pause");
return 0;
}
输入:
n=4 W=50
w={10,20,30}
v={60,100,120}
输出:
排序后的物品顺序:index变为: 0,1, 2
Item={1,1,0.666667}