一、上机目的
1、通过贪心算法的示例程序理解贪心算法的基本思想;
2、运用贪心算法解决实际问题加深对贪心算法的理解和运用;
二、上机内容与要求
1、分析并掌握“会场安排” 问题的贪心算法求解方法;
三、上机步骤
1.理解贪心算法思想和算法示例;
2.上机输入和调试算法示例程序;
3.理解实验题的问题要求;
4.上机输入和调试自己所编的实验题程序;
5.验证并分析实验题的实验结果;
6.整理出实验报告
四、上机结果
1、将课本4.1节活动安排问题改为程序,输入数据并进行验证和测试
public class GreedySelector {
static int GreedySelector(int[] s, int[] f, int[] a) {
int n = s.length - 1;
a[0] = 1; //安排活动一
int j = 1;
int count = 1;
for (int i = 2; i <= n; i++) {
if (s[i] >= f[j]) {
a[i] = 1; //安排活动i
j = i;
count++;
} else a[i] = 0;
}
return count;
}
public static void main(String[] args) {
int n = 11;
int[] s = new int[]{1, 3, 0, 5, 3, 5, 6, 8, 8, 2, 12};
int[] f = new int[]{4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};
int[] a = new int[n];
GreedySelector manger = new GreedySelector();
int k = manger.GreedySelector(s, f, a);
System.out.println("最多可安排的活动个数是:" + k);
System.out.println("具体的活动是:");
for (int i = 0; i < n; i++)
if (a[i] == 1)
System.out.println("活动" + i);
}
}
2、将4.5节单源最短路径算法改为程序,并输入数据进行测试和验证
import java.util.Scanner;
public class DijkstraPath {
private static int N;
private static int M;
private static int max;
private static int[] visit;
private static int[][] distance;
private static int[] bestmin;
private static String[] path;
public static void Dijkstra() {
visit[1] = 1;
bestmin[1] = 0;
//大循环(搞定这里就算搞定该算法了,后面的输出什么的可以不看)
for(int l = 2; l <= N; l++) {
int Dtemp = max;
int k = -1;
for(int i = 2; i <= N; i++) {
if(visit[i] == 0 && distance[1][i] < Dtemp) {
Dtemp = distance[1][i];
k = i;
}
}
visit[k] = 1;
bestmin[k] = Dtemp;
for(int i = 2; i <= N; i++) {
if(visit[i] == 0 && (distance[1][k] + distance[k][i]) < distance[1][i]) {
distance[1][i] = distance[1][k] + distance[k][i];
path[i] = path[k] + "-->" + i;
}
}
}
//输出路径
for(int i=1;i<=N;i++) {
System.out.println("从"+1+"出发到"+i+"的最短路径为:"+path[i]);
}
System.out.println("=====================================");
for(int i = 1; i <= N; i++) {
System.out.println("从1出发到" + i + "点的最短距离为:" + bestmin[i]);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
System.out.print("请输入节点个数N,路径总数M: ");
N = input.nextInt();
M = input.nextInt();
max = 10000;
bestmin = new int[N+1];
distance = new int [N+1][N+1];
visit = new int[N+1];
path=new String[N+1];
for(int i = 1; i <= N; i++) {
for(int j = 1; j <= N; j++) {
if(i == j) {
distance[i][j] = 0;
}else {
distance[i][j] = max;
}
}
bestmin[i] = max;
path[i] = new String("1-->" + i);
}
System.out.println("请输入" + M +"条数据x,y,z(表示x点到y点的距离为z):");
for(int i = 1; i <= M; i++) {
int x = input.nextInt();
int y = input.nextInt();
int z = input.nextInt();
distance[x][y] = z;
}
input.close();
Dijkstra();
}
}
实例:
请输入节点个数N,路径总数M: 5 7
请输入7条数据x,y,z(表示x点到y点的距离为z):
1 2 10
1 4 30
1 5 10
2 3 50
3 5 10
4 5 60
4 3 20
3、删数问题:任意给定一个位正整数,去掉其中任意个数字后;剩下的数字按照原有次序排列组成的一个新的正整数,试用贪心算法求出一个删除方案使得值最小;
import java.util.Scanner;
public class ShanShu {
static int shanshu(char[] a, int k) {
int n = a.length;
while (k > 0) {
for (int i = 0; i < n; i++) {
if (i == n - 1) {
n--;
break;
} else if (a[i] > a[i + 1]) {
System.arraycopy(a, i + 1, a, i, n - i - 1);
n--;
break;
}
}
k--;
}
return n;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("please enter a number:");
String input = scanner.nextLine();
char[] inputArray = input.toCharArray();
System.out.println("please enter k:");
int k = scanner.nextInt();
int m = shanshu(inputArray, k);
int b = 0;
while (b < m - 1 && inputArray[b] == '0') {
b++;
}
System.out.println("output :");
for (int i = b; i < m; i++) {
System.out.print(inputArray[i]);
}
}
}
小编有话说
创作不易,感谢未来首富们的支持和关注!!