贪心算法总是做出当前最好的选择,期望通过局部最优获得全局最优。
运用贪心策略解决问题在程序执行过程中无回溯过程;
部分背包问题:
一个容量为100的背包放满物品(可以选择部分物品)
按照性价比来放入物品
常用到结构体数组,for循环遍历加if语句
代码实现:
#include <bits/stdc++.h>
using namespace std;
const int N=110;
int n,c;
struct node
{
int v;
int w;
double vdw;
};
struct node p[N];
bool cmp(node a,node b)
{
return a.vdw>b.vdw;
}
int main()
{
cin>>n>>c;
for(int i=0;i<n;i++)
{
cin>>p[i].w>>p[i].v;
p[i].vdw=(double)p[i].v/p[i].w;
}
sort(p,p+n,cmp);
double sum=0.0;
for(int i=0;i<n;i++)
{
if(c>=p[i].w)
{
sum+=p[i].v;
c-=p[i].w;
}
else
{
sum+=p[i].vdw*c;
break;
}
}
cout<<sum;
return 0;
}
区间调度:
有n项工作,固定时间内在尽可能的情况下选择更多的工作
每个问题有不同的贪心策略,具体情况具体分析
一般使用结构体数组储存数据,用到快排和循环加if语句,bool函数要熟悉使用
代码实现:
#include<bits/stdc++.h>
using namespace std;
const int N=110;
struct node{
int s;
int t;
}a[N];
bool cmp(node a,node b)
{
return a.t<b.t;
}
int main()
{
int n,cnt=1;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i].s>>a[i].t;
}
sort(a,a+n,cmp);
int t=a[0].t;
for(int i=1;i<n;i++)
{
if(a[i].s>t)
{
cnt++;
t=a[i].t;
}
}
cout<<cnt<<endl;
return 0;
}