五、算法_动态规划_背包01

动态规划:背包问题01位

  问题:有一个m KG的背包和物品 { T1 T2 T3 Tn },每件物品价格{ P1 P2 P3 Pn },现在要把所有最大价值的物品放进背包中,且每个物品只能放入一次(不能超出背包重量),其中所有的条件都是已知的,求最大价值;

穷举法:

using System;

namespace 动态规划_背包穷举 {
    class Program {
        static void Main (string[] args) {
            int pMKG ;
            int[] pWkg = new[] { 0, 3, 4, 5 };
            int[] pPrices = new[] { 0, 4, 5, 6 };
            Console.WriteLine(Exhaustivity(10, pWkg, pPrices));
            Console.WriteLine(Exhaustivity(3, pWkg, pPrices));
            Console.WriteLine(Exhaustivity(4, pWkg, pPrices));
            Console.WriteLine(Exhaustivity(5, pWkg, pPrices));
            Console.WriteLine(Exhaustivity(7, pWkg, pPrices));
            Console.WriteLine();
            Console.ReadKey();
        }
        //  ------------穷举法------------
        public static int Exhaustivity (int mKg, int[] wKg, int[] prices) {
            //  物品个数
            int mRefI = wKg.Length-1;
            int pMaxPrices = 0;
            for (int i = 0; i < Math.Pow(2, mKg); i++) {
                //  重量和
                int pWeightTotal = 0;
                //  价格和
                int pPricesTotal = 0;
                //  取得 i 上某一位的二进制值
                for (int j = 1; j <= mRefI; j++) {
                    int pResult = Get(i, j);
                    if (pResult == 1) {
                        //  物品的价格和重量
                        pWeightTotal += wKg[j];
                        pPricesTotal += prices[j];
                    }
                }
                //  设置最大价值,和判断背包是否放得下物品
                if (pWeightTotal <= mKg && pPricesTotal > pMaxPrices) {
                    pMaxPrices = pPricesTotal;
                }
            }
            return pMaxPrices;
        }

        //  取得 i 上第几位上的二进制值,是1或者0
        //  按位与运算
        public static int Get (int pNumber, int pIndex) {
            int a = pNumber;
            int b = (int)Math.Pow(2, pIndex - 1);
            int pRef = a & b;
            if (pRef == 0) {
                return 0;
            }
            return 1;
        }
    }
}

动态规划(自底向上):

namespace 动态规___自底向上 {
    class Program {
        static void Main (string[] args) {
            int pMKG;
            int[] pWkg = new[] { 0, 3, 4, 5 };
            int[] pPrices = new[] { 0, 4, 5, 6 };

            Console.WriteLine(BottomUp(10,3, pWkg, pPrices));
            Console.WriteLine(BottomUp(3,3, pWkg, pPrices));
            Console.WriteLine(BottomUp(4,3, pWkg, pPrices));
            Console.WriteLine(BottomUp(5,3, pWkg, pPrices));
            Console.WriteLine(BottomUp(7,3, pWkg, pPrices));
            Console.WriteLine();
            Console.ReadKey();

        }

        public static int[,] pResult = new int[11, 4];
        public static int BottomUp (int mKg, int pIndex, int[] wKg, int[] pPrices) {
            if (pResult[mKg, pIndex] != 0)
                return pResult[mKg, pIndex];
            for (int i = 0; i < mKg + 1; i++) {
                for (int j = 1; j < pIndex + 1; j++)
                {
                    if (pResult[i, j] != 0) continue;
                    if (wKg[j] > i) {
                        pResult[i, j] = pResult[i, j - 1];
                    } else {
                        int pMaxValue1 = pResult[i - wKg[j], j - 1] + pPrices[j];
                        int pMaxValue2 = pResult[i, j - 1];
                        if (pMaxValue1 > pMaxValue2) {
                            pResult[i, j] = pMaxValue1;
                        } else {
                            pResult[i, j] = pMaxValue2;
                        }// End if
                    }// End if
                }
            }// End for
            return pResult[mKg, pIndex];
        }// End bottomup

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值