static void Main(string[] args) { //步兵 TroopItem infantry = new TroopItem { id = 1, level = 3, load = 1, own_num = 40 }; //弓兵 TroopItem archer = new TroopItem { id = 2, level = 4, load = 2, own_num = 30 }; //骑兵 TroopItem sowar = new TroopItem { id = 3, level = 4, load = 3, own_num = 20 }; //攻城兵 TroopItem Siege = new TroopItem { id = 4, level = 4, load = 4, own_num = 10 }; List <TroopItem> data = new List <TroopItem> { infantry, archer, sowar, Siege }; List <TroopItem> res = QuickSelectTroopList(250, 200, data); for (int i = 0; i < res.Count; i++) { Console.Write(res[i].id + " " + res[i].select_num); Console.WriteLine(); } Console.ReadLine(); }
//贪心算法,从拉取最多资源数的士兵开始拉取资源 //有四个兵种(步兵,弓兵,骑兵,攻城兵) static List <TroopItem> QuickSelectTroopList(int res_max, int march_size_max, List <TroopItem> own_troop_list) { int loadSource = 0; //初始可加载资源数(可携带资源兵种最大的兵种) int soldierNum = 0; //初始士兵数量 List <TroopItem> res = new List <TroopItem>(); for (int i = own_troop_list.Count - 1; i >= 0; i--) { loadSource += own_troop_list[i].load; for (int j = 1; j <= own_troop_list[i].own_num; ++j) { //若携带资源数大于等于需要资源或者士兵数量超出可携带上限 if (loadSource >= res_max || soldierNum >= march_size_max) { TroopItem temp = new TroopItem { id = own_troop_list[i].id, select_num = j }; res.Add(temp); break; } else { if (j == own_troop_list[i].own_num) { TroopItem temp = new TroopItem { id = own_troop_list[i].id, select_num = own_troop_list[i].own_num }; res.Add(temp); } else { loadSource += own_troop_list[i].load; soldierNum++; } } } Console.WriteLine("LoadSource: " + loadSource + "\t SoldierNumber: " + (soldierNum + 1)); if (loadSource >= res_max || soldierNum >= march_size_max) { break; } } return(res); }