贪婪算法、递归计算、动态规划背包问题


   //贪婪算法计算背包问题        public static double  ksack(double[] values, double[] weights, int capacity)        {            double load = 0;            int i = 0;            double w = 0;            while (load<capacity && i<values.Length)            {                if (weights[i] <= (capacity-load))                {                    w += values[i];                    load += weights[i];                }                else                {                    double r = (capacity - load) / weights[i];                    w += r * values[i];                    load += weights[i];                }                i++;            }            return w;        }


 //递归计算背包问题
        public static int max(int a, int b)
        {
            return a > b ? a : b;
        }
 
        public static int knapsack(int cappcity, int[] size, int[] value, int n)
        {
            if (n == 0 || cappcity == 0)
            {
                return 0;
            }
            if (size[n - 1] > cappcity)
            {
                return knapsack(cappcity, size, value, n - 1);
            }
            else
            {
                return max(value[n - 1] + knapsack(cappcity - size[n - 1], size, value, n - 1), knapsack(cappcity, size, value, n - 1));
            }
        }



        //动态规划背包问题
        public static long dKnapsack(int cappcity, int[] size, int[] value, int n)
        {
            int[,] K = new int[n, cappcity + 1];
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < cappcity; j++)
                {
                    K[i, j] = 0;
                }
            }
 
            for (int i = 0; i < n; i++)
            {
                for (int w = 0; w < cappcity; w++)
                {
                    if (i == 0 || w == 0)
                    {
                        K[i,w] = 0;
                    }
                    else if (size[i - 1] <= w)
                    {
                        K[i,w] = max(value[i - 1] + K[i - 1,w-size[i-1]], K[i - 1,w]);
                    }
                    else
                    {
                        K[i,w] = K[i - 1,w];
                    }
                }
            }
            return K[n,cappcity];
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值