文章目录
- 一、贪心算法简介
- 二、贪心算法步骤
- 三、贪心--绝对贪婪
- 题目及运行
- 四、贪心--相对贪婪
- 题目及运行
- 五、总结
前言
算法语言--Java语言
一、贪心算法简介
贪心算法又叫登山算法,它的根本思想是逐步到达山顶,即逐步获得最优解,是解决最优化问题时的一种简单但适用范围有限的策略。
“贪婪”可以理解为以逐步的局部最优,达到最终的全局最优。
但这种最优选择并不总能获得整体最优解,但通常能获得近似最优解。
因此一定要注意判断问题是否适合采用贪心算法策略,找到的解是否一定是问题的最优解。
二、贪心算法步骤
贪心策略下的框架有:
1、从问题的某一初始解出发
2、while能朝给定总目标前进一步do
3、利用可行的决策,求出可行解的一个解元素
4、由所有解元素组合成问题的一个可行解
注意:选择贪心算法要具有无后向性,即某一个阶段选出解后,之后的过程不会受到影响。
三、 贪婪--绝对贪婪
1、绝对贪婪举例
分数表示问题:设计一个贪心算法,把一个真分数表示为最少埃及分数之和的形式,所谓埃及分数是指分子为1的分数,如7/8 = 1/2 + 1/3 + 1/24。
解答本题的基本思路是:逐步选择分数所包含的最大埃及分数,这些埃及分数之和就是问题的一个解。
如:7/8>1/2
7/8-1/2 >1/3
7/8-1/2-1/3 = 1/24
步骤如下:
(1)找出最小n,使分数f>1/n
(2)输出1/n
(3)计算f = f-1/n
(4)若此时的f是埃及分数,输出f,算法结束否则返回到步骤1
2、代码实现
public class Ioput {
public static void main(String[] args) {
int temp = Egyptiansorse(7,8);
}
static int Egyptiansorse(int a,int b){
int m = a;//分子
int n = b;//分母
while (m>1){
int temp1 = 0;
int temp2 = 0;
int c = 0;
int d = 0;
//第一步
temp1 = n/m;//分母除以分子
temp2 = temp1+1;
System.out.println("1/"+temp2);
//第二步
c = m*temp2-n*1;//新分子
d = n*temp2;//新分母
int temp = Maxcomdvs(c,d);//最大公约数
m = c/temp;//分子除以最大公约数
n = d/temp;//分母除以最大公约数
if(m==1){
System.out.println(m+"/"+n);
}
}
return 1;
}
static int Maxcomdvs(int a,int b){//求最大公约数
int c;
c = a%b;
while (c>0){
a = b;
b = c;
c = a%b;
}
return b;
}
}
3、运行如下
四、贪婪--相对贪婪
1、相对贪婪举例
币种统计问题:某单位给每个职工发工资(精确到元)。为了保证不要临时兑换零钱,且取款的张数最少,取工资前要统计所需各种币值(100,50,20,10,5,2,1元共7种)的张数。
例如:工资为125元——100元1张,20元1张,5元1张。
步骤如下:
(1)从键盘输入每人的工资
(2)用“贪心”的思想,由大到小取尽可能多的币种
(3)将七种币值存在数组当中,由大到小存储
(4)利用数组,设置一个累加器数组
2、代码实现
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int money[] = {0,100,50,20,10,5,2,1};
int count[] = new int[8];
System.out.println("请输入发工资的人数:");
Scanner in = new Scanner(System.in);
int n = in.nextInt();
System.out.println("请分别输入各自的工资:");
for (int i =1;i<=n;i++){
int wages = in.nextInt();
for (int j = 1;j<=7;j++){
int a = wages/money[j];//得到最大币值数
count[j] +=a;//记录币值数
wages = wages-a*money[j];//去掉最大币值后的钱
}
}
for (int i = 1;i<=7;i++){
System.out.println(money[i]+"元"+"————"+count[i]+"张");
}
}
}
3、运行如下
五、总结
贪心算法的特征:
(1)最优子结构性质:当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。
(2)贪心选择性质:以局部最优的选择,达到整体最优。
(3)并不能每次都能达到最优,需要问题具有无后向性,前面的决定不影响后面。