贪心算法基础
1 /*有一个背包,背包容量是M=150kg。有7个物品,物品不可以分割成任意大小。要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。 2 3 物品 A B C D E F G 4 5 重量 35kg 30kg 6kg 50kg 40kg 10kg 25kg 6 7 价值 10$ 40$ 30$ 50$ 35$ 40$ 30$ 8 9 分析: 10 11 目标函数:∑pi最大 12 13 约束条件是装入的物品总重量不超过背包容量:∑wi<=M(M=150) 14 15 ⑴根据贪心的策略,每次挑选价值最大的物品装入背包,得到的结果是否最优? 16 17 ⑵每次挑选所占重量最小的物品装入是否能得到最优解? 18 19 ⑶每次选取单位重量价值最大的物品,成为解本题的策略。 20 */ 21 22 using System; 23 using System.Collections.Generic; 24 using System.Linq; 25 26 namespace GreedyAlgorithm 27 { 28 class Program 29 { 30 static void Main(string[] args) 31 { 32 Thing t1 = new Thing(10,35) { kg = 35, pirce = 10 }; 33 Thing t2 = new Thing(40,30) { kg = 30, pirce = 40 }; 34 Thing t3 = new Thing(30,6) { kg = 6, pirce = 30 }; 35 Thing t4 = new Thing(50,50) { kg = 50, pirce = 50 }; 36 Thing t5 = new Thing(35,40) { kg = 40, pirce = 35 }; 37 Thing t6 = new Thing(40,10) { kg = 10, pirce = 40 }; 38 Thing t7 = new Thing(30,25) { kg = 25, pirce = 30 }; 39 List<Thing> list = new List<Thing>(); 40 list.Add(t1); 41 list.Add(t2); 42 list.Add(t3); 43 list.Add(t4); 44 list.Add(t5); 45 list.Add(t6); 46 list.Add(t7); 47 //取重量最小的 48 int b = 0; 49 int forprice= getMAXKG(list ,out b); 50 Console.WriteLine("取重量最小的--------------------重量:" + b + " * *价格"+ forprice); 51 Console.WriteLine("**********************************************************************"); 52 //取价值最高的 53 int c = 0; 54 int forp = getMAXPrice(list,out c); 55 Console.WriteLine("取价格最大的--------------------重量:" + c + " * *价格" + forp); 56 Console.WriteLine("**********************************************************************"); 57 //取单价最高的 58 int d = 0; 59 int univalence = getMAXunivalence(list, out d); 60 Console.WriteLine("取价格最大的--------------------重量:" + d + " * *价格" + univalence); 61 Console.ReadKey(); 62 } 63 64 private static int getMAXunivalence(List<Thing> li,out int b) 65 { 66 int a = 0; 67 b = 0; 68 List<Thing> c = li.OrderBy(i => i.univalence).ToList(); 69 foreach (var item in c) 70 { 71 if (b + item.kg > 150) 72 { 73 return a; 74 } 75 a += item.pirce; 76 b += item.kg; 77 Console.WriteLine("按单价最小取--------------------:KG:" + item.kg.ToString() + "* *Price:" + item.pirce.ToString() + "* *单价" + item.univalence.ToString()); 78 } 79 return a; 80 } 81 82 private static int getMAXPrice(List<Thing> li,out int b) 83 { 84 int a = 0; 85 b = 0; 86 List<Thing> c = li.OrderByDescending(i => i.pirce).ToList(); 87 foreach (var item in c) 88 { 89 if (b + item.kg > 150) 90 { 91 return a; 92 } 93 a += item.pirce; 94 b += item.kg; 95 Console.WriteLine("按价格最大取--------------------:kg:" + item.kg.ToString() + "* *Price:" + item.pirce.ToString() + "* *单价" + item.univalence.ToString()); 96 } 97 return a; 98 } 99 100 private static int getMAXKG(List<Thing> li,out int b) 101 { 102 int a = 0; 103 b = 0; 104 List<Thing> c= li.OrderBy(i => i.kg).ToList(); 105 foreach (var item in c) 106 { 107 if (b + item.kg > 150) 108 { 109 return a; 110 } 111 a += item.pirce; 112 b += item.kg; 113 Console.WriteLine("按重量最小取--------------------:KG:" + item.kg.ToString() + "* *Price:" +item.pirce.ToString()+"* *单价"+ item.univalence.ToString()); 114 } 115 return a; 116 } 117 } 118 public class Thing 119 { 120 public int kg { get; set; } 121 public int pirce { get; set; } 122 public float univalence; 123 public Thing(int a,int b) 124 { 125 univalence= (float)a / b; 126 } 127 } 128 }