vlambda博客
学习文章列表

贪心算法的复习和总结


题    目

经过 几天的学习
贪心算法已经全面结束
经过比较
个人认为
贪心算法较为简单
贪心算法
如果和DP或二分比起来
是最简单的一个
贪心和搜索与回溯较像
可能有人会问我
这有什么相似
它们的相同点是
都有一定的套路
比如说搜索与回溯有模板
而贪心
有一个重要的点
就是每次都要排序
每次都排一下序
因为贪心
每次都会选择最好的
最大的或者最小的
所以每次都要排序
接着再一个一个比大小
贪心就是选择最大的或者最小的
不断地比大小
如果符合条件
就选择
那个
看起来最好的
最后输出就可以了
所以
贪心的难度
也算是比较简单的



一  个  例  子



贪心算法的复习和总结
部分背包问题


  给定一个最大载重量为M的卡车和N种食品,有食盐,白糖,大米等。已知第i种食品的最多拥有Wi公斤,其商品价值为Vi元/公斤,编程确定一个装货方案,使得装入卡车中的所有物品总价值最大。




加油!



解    析



贪心算法的复习和总结
      部分背包问题是贪心的最基础题,基本所有学贪心算法的都是先从部分背包开始的,而且很多时候部分背包会稍微变个形,改头换面以其他方式出现。一般是比较简单的题目。可是就是因为简单,如果丢分了才更可惜。

      做法很简单,典型贪心,先排序,再一个一个放上去,就可以了。




加油!



代     码



贪心算法的复习和总结

#include<bits/stdc++.h>

#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
int main()
{
int n,m,w[1000],p[1000],temp,sum=0;
cin>>n>>m;
for(int i=1;i<=m;i++) cin>>w[i]>>p[i];
for(int i=1;i<=m;i++)
{
for(int j=i+1;j<=m;j++)
{
if(p[i]<p[j])
{
temp=p[i];
p[i]=p[j];
p[j]=temp;
temp=w[i];
w[i]=w[j];
w[j]=temp;
}
}
}
for(int i=1;i<=m;i++)
cout<<w[i]<<" "<<p[i]<<endl;
cout<<endl;
for(int i=1;i<=m;i++)
{
if(n-w[i]>=0)
{
sum+=(w[i]*p[i]);
n-=w[i];
if(n==0) break;
}
else
{
sum+=n*p[i];
break;
}
}
cout<<sum<<endl;
return 0;
}



加油!




贪心算法的复习和总结

题外话:下次准备开始分治算法了。




加油




往期精彩推荐




某些图片来自互联网,如有侵权,请联系删除


欢迎关注

亮星的信息学小屋

亮星的信息学小屋

贪心算法的复习和总结


觉得有用,请点右下方“在看”,谢谢鼓励