動態規劃之0-1揹包問題

namespace SeqListSort
{
    /// <summary>
    /// <content>
    /// 有n件物品和一個容量爲m的揹包。第i件物品的價值是v[i],重量是w[i]。求解將哪些物品裝入
    /// 揹包可以使價值總和最大
    /// 動態規劃中最最最重要的兩個概念: 狀態和狀態轉移方程在這個問題中分別是什麼
    /// 狀態就是f[i,j] 即 表示前i件物品重量的價值j
    /// 狀態轉移方程 f[i,j] = max(f[i - 1,j - w[i] + v[i]]);//裝入揹包,f[i,j] = f[i - 1,j]//沒有裝入
    /// 1<= i <=n;  0 <= j <=m; 初始值 f[0,j] = 0; 時間複雜度O(n*m)最終結果爲f[n,m]的值
    /// </content>
    /// </summary>
    class Knapsack_DP
    {
        static int n = 5;//物品數量
        static int m = 10;//揹包容量
        static int[,] f = new int[n + 1,m + 1];//
        static int[] weight = new int[] { 0, 2, 2, 6, 5, 5 };// 各個物品的重量
        static int[] value = new int[] { 0, 6, 3, 5, 4, 6 };//各個物品的價值

        public static void KnapsackDP()
        {
            int i = 0;
            int j = 0;
            
            for (i = 1; i <= n; ++i)
            {
                for (j = 1; j <= m; ++j)
                {
                    f[0, j] = 0;//初始值
                    if (j >= weight[i])// 裝入揹包
                    {
                        f[i, j] = Max(f[i - 1, j], f[i - 1, j - weight[i]] + value[i]);
                    }
                    else f[i, j] = f[i - 1, j];//不裝入揹包f[i-1,j];
                }
            }
            Console.WriteLine("最大價值是{0,-3}", f[n, m]);
        }

        public static int Max(int a, int b)
        {
            return a = a > b ? a : b;
        }
相關文章
相關標籤/搜索