贪心复习

贪心复习

经过两天的复习

贪心算法已经全面复习结束

经过比较

个人认为

贪心算法较为简单

贪心算法

如果和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;
}

拜拜

发布了24 篇原创文章 · 获赞 0 · 访问量 608

猜你喜欢

转载自blog.csdn.net/zliang_ma/article/details/104598101