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; }