《趣学算法》第二章 贪心算法代码实现(Java)

这篇博客详细介绍了贪心算法在解决最优装载问题、0-1背包问题、会议调度冲突、哈夫曼编码和最小生成树(使用Kruskal算法)等经典问题上的Java代码实现,通过实例展示了算法的运行结果。
摘要由CSDN通过智能技术生成

2.2最优装载问题

import java.util.Scanner;
import java.util.Arrays;

public class Test2_2 {
        public static void main(String[] args) {
            Scanner scanner=new Scanner(System.in);
            System.out.println("请输入载重量c及古董个数n:");
            int c=scanner.nextInt();                           //载重量
            int n=scanner.nextInt();                           //古董个数

            int[] weight=new int[n];
            System.out.println("请输入每个古董的重量:");
            for(int i=0;i<n;i++)
                weight[i]=scanner.nextInt();
            Arrays.sort(weight);

            int temp=0;                                        //记录装载到船上的古董重量
            int answer=0;                                      //记录已装载的古董个数
            for(int i=0;i<n;i++) {
                temp+=weight[i];                               //贪心策略:每次装入最轻者
                if(temp<=c)                                    //若加入最轻者后还小于载重量,则古董个数+1
                    answer++;
                else
                    break;
            }

            System.out.println("能装入的古董最大数量为answer="+answer);
            scanner.close();
        }
}

程序运行结果如下:
这里写图片描述

2.3背包问题

/*阿里巴巴与四十大盗——背包问题*/
import java.util.Scanner;

class three {
    double w=0;               //每个宝物的重量
    double v=0;               //每个宝物的价值
    double p=0;               //性价比

}


public class Test2_3 {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入宝物数量n及毛驴的承载能力m:");
        int n=scanner.nextInt();               //表示n个宝物
        double m=scanner.nextDouble();         //表示毛驴的承载能力
        System.out.println("请输入每个宝物的重量和价值,用空格分开:");

        three[] s=new three[n];                //定义n长的数组存放宝物,数组类型是three型,即数组每位由重量、价格和性价比组成
        for(int i=0;i<n;i++) {
            s[i]=new three();
            s[i].w=scanner.nextDouble();
            s[i].v=scanner.nextDouble();
            s[i].p=s[i].v/s[i].w;
        }
        selectionSort(s);

        double sum=0;                          //表示贪心记录运走宝物的价值之和
        for(int i=0;i<n;i++) {
            if(m>s[i].w) {                     //如果宝物的重量小于毛驴剩下的承载能力
                sum+=s[i].v;                   //宝物价值之和增加
                m-=s[i].w;                     //毛驴承载能力减少
            }
            else {                             //如果宝物的重量大于毛驴剩下的承载能力,则进行部分装载
                sum+=m*s[i].p;                 //价值增加部分重量的价值
                break;
            }
        }

        System.out.println("装入宝物的最大价值Maximum value="+sum);
        scanner.close();
    }   

    public static void selectionSort(three[] array){          //运用选择排序将宝物按照性价比由大到小进行排序

        three temp=new three();
        for(int i=0;i<array.length-1;i++){      
            for(int j=i+1;j<=array.length-1;j++){ 
                 if(array[i].p<array[j].p){          
                    temp = array[i];                          //要将类的所有成员变量进行换位置,因为值是相互对应的
                    array[i] = array[j];
                    array[j] = temp;
                 }
            }
        }
    }
}

程序运行结果如下:
这里写图片描述

2.4会议安排

import java.util.Scanner;

class Meet{
    int beg;                               
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值