贪心算法目录
一.贪心算法的思路
贪心顾名思义,比如说现在我贪玩,不卷,那么我以后可能会不爽,但是现在我非常爽,就是当下的最有解.
就是我看眼前的我怎么舒服怎么来.
二.换零钱
一般我们会设置手头面值最大的值来进行换取,不够再用小面值的凑.
假设如下是我所拥有的零钱value是面值,count是对应面值的数量.
那么我是从后往前来进行的遍历先是面值最大的.
可以自动需要几张.
判断该面值的数量够不够.
三.完整代码
cpp
#include <stdio.h>
#include <stdlib.h>
#define N 7
int value[N] = { 1,2,5,10,20,50,100 };
int count[N] = { 10,2,3,1,2,3,5 };
//int value[N] = { 1,2,5,10,20,50,100 };//不是最优解
//int count[N] = { 0,0,0,0,3,1,0 };
int solve(int money)
{
int num = 0;
int i = 0;
for (i = N - 1; i >= 0; i--)
{
int j = money / value[i];
int c = j > count[i] ? count[i] : j;
printf("需要用面值 %d 的纸币 %d z张\n", value[i], c);
money -= c * value[i];
num += c;
if (money == 0)break;
}
if (money > 0)num = -1;
return num;
}
int main()
{
int money=0;
int num=0;
printf("请输入要换的钱数目:\n");
scanf_s("%d", &money);
num = solve(money);
if (num == -1)
{
printf("对不起,找不开\n");
}
else
{
printf("成功的使用至少%d张纸币实现找零\n", num);
}
system("pause");
return 0;
}
运行结果:
但是我用这种情况的时候,就不是最优解了.
运行结果:
本来有3张20的,但是他却没有换开.
四.贪婪使用场景
所以当我们要求速度或者只顾当前的最优解,那么我们可以考虑贪心算法.
但是顾局大全就不可以了,所谓目光短浅,就是如此.
2024年8月17日19:59:34