贪心算法

       贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。


满足条件

1、可行性:即它必须满足问题的约束

2、局部最优:它是当前步骤中所有可行选择中最佳的局部选择

3、不可取消:即选择一旦做出,在算法的后面步骤中就无法改变了

      贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备 无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。


问题

找零钱问题、最小生成树--Prim算法、Kruskal算法、最短路径问题--Dijkstra算法、霍夫曼编码


一、找零钱问题
题目:对于人民币的面值有1元 5元 10元 20元 50元 100元,下面要求设计一个程序,输入找零的钱,输出找钱方案中最少张数的方案,比如123元,最少是1张100的,1张20的,3张1元的,一共5张!

这样的题目运用的贪心策略是每次选择最大的钱,如果最后超过了,再选择次大的面值,然后次次大的面值,一直到最后与找的钱相等,
#include<iostream>
#define N 6
using namespace std;

int main()
{
	int i;
	int money[N] = { 100,50,20,10,5,1 };
	int val_count[N];
	int x;
	int sum=0;
	cout << "请输入你需要找零钱的总额:" << endl;
	cin >> x;
	memset(val_count,0,sizeof(val_count));
	for (i = 0; i < N; i++)
	{
		while((x-sum)>=money[i])
		{
			sum += money[i];
			val_count[i] += 1;
			cout << money[i] << " ";
		}
		continue;
	}
	system("pause");
	return 0;
}

二、数字组合问题
设有N个正整数,现在需要你设计一个程序,使他们连接在一起成为最大的数字,例3个整数 12,456,342 很明显是45634212为最大,4个整数 342,45,7,98显然为98745342最大
程序要求:输入整数N 接下来一行输入N个数字,最后一行输出最大的那个数字!
#include<iostream>
using namespace std;

bool compare(int n1, int n2)
{
	int a, b;
	int a1,a2,count1,count2;
	count1 = count2 = 0;
	a1 = n1, a2 = n2;
	while (a1)
	{
		a1 /= 10;
		count1 += 1;
	}
	while (a2)
	{
		a2 /= 10;
		count2 += 1;
	}
	a = n1*pow(10, count2) + a2;
	b = n2*pow(10, count1) + a1;
	return (a > b) ? true : false;
}
int main()
{
	int i,n, p, j, temp;
	int *array;
	
	cout << "请输入整数个数:";
	cin >> n;
	array = (int*)malloc(n*sizeof(int));
	cout << "请输入n个整数:";
	for (i = 0; i < n; i++)
		cin >> array[i];
	
	for (p= 0; p<n - 1; p++)
		for (j= 0; j < n - p - 1; j++)
		{
			if (compare(array[j],array[j+1]))
			{
				temp = array[j];
				array[j + 1] = temp;
					array[j] = array[j + 1];
			}
		}
	for (i = n-1; i >=0; i--)
		cout << array[i];
	system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值