C# 贪心算法——活动选择问题

贪心算法:

        对于许多最优化问题,使用动态规划算法来求最优解有些杀鸡用牛刀了,可以使用更加简单、更加高效的算法。贪心算法就是这样的算法,它在每一步做出当时看起来最佳的选择。也就是说它总是做出局部最优的选择,从而得到全局最优解。对于某些问题并不保证得到最0优解,但对很多问题确实可以求得最优解。

活动选择问题:

动态规划算法: 

internal class Program
    {
        static void Main(string[] args)
        {
            int[] s = { 0, 1, 3, 0, 5, 3, 5, 6, 8, 8, 2, 12, 24 };//开始时间
            int[] f = { 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 24 };//结束时间

            List<int>[,] result = new List<int>[13, 13];// 默认值null
            for (int m = 0; m < 13; m++)
            {
                for (int n = 0; n < 13; n++)
                {
                    result[m, n] = new List<int>();
                }
            }//默认值就是空list集合

            for (int j = 0; j < s.Length; j++)
            {
                for (int i = 0; i < j - 1; i++)
                {
                    //s[ij] i结束j开始  之间的活动集合
                    //f[i] s[j]之间所有活动
                    List<int> sij = new List<int>();
                    for (int number = 1; number < s.Length - 1; number++)
                    {
                        if (s[number] >= f[i] && f[number] <= s[j])
                        {
                            sij.Add(number);
                        }
                    }
                    if (sij.Count > 0)
                    {
                        int maxCount = 0;
                        List<int> tempList = new List<int>();
                        foreach (int number in sij)
                        {
                            int count = result[i, number].Count + result[number, j].Count + 1;
                            //int count = result[i, j].Count  + 1;
                            if (count > maxCount)
                            {
                                maxCount = count;
                                tempList = result[i, number].Union<int>(result[number, j]).ToList<int>();
                                tempList.Add(number);
                            }
                        }
                        result[i, j] = tempList;
                    }

                }

            }
            Console.WriteLine(result[0, 12]);
            foreach (int number in result[0, 12])
            {
                Console.WriteLine(number);
            }
        }
    }

贪心算法-递归:

internal class Program
    {
        static void Main(string[] args)
        {
            List<int> answer = ActivitySelection(1, 11, 0, 24);
            foreach (int i in answer)
            {
                Console.Write(i+" ");
            }
        }
        static int[] s = { 0, 1, 3, 0, 5, 3, 5, 6, 8, 8, 2, 12 };//开始时间
        static int[] f = { 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 };//结束时间
        public static List<int> ActivitySelection(int startActivityNumber ,int endActivityNumber ,int startTime ,int endTime)
        {
            if (startTime >= endTime||startActivityNumber>=endActivityNumber) return new List<int>();
            //寻找结束时间最早活动
            int temp = 0;
            for (int number =  startActivityNumber; number <= endActivityNumber; number++)
            {
                
                if (s[number] >= startTime && f[number] <= endTime)
                {
                    temp = number;
                    break;
                }
            }
            List<int> result = ActivitySelection(temp + 1, endActivityNumber, f[temp], endTime);
            result.Add(temp);
            return result;
        }
    }

贪心算法-迭代:

internal class Program
    {
        static void Main(string[] args)
        {
            int[] s = { 0, 1, 3, 0, 5, 3, 5, 6, 8, 8, 2, 12 };//开始时间
            int[] f = { 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 };//结束时间

            int startTime = 0;
            int endTime = 24;
            List<int> list = new List<int>();
            for(int number = 1; number <=11; number++)
            {
                if (s[number] >= startTime && f[number] <= endTime)
                {
                    list.Add(number);
                    startTime = f[number];
                }
            }
            foreach(int number in list )
            {
                Console.WriteLine(number);
            }
        }
    }

结果:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值