
项目结构/* # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 Algorithms # Author : geovindu,Geovin Du 涂聚文. # IDE : vs2026 c# .net 10 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/07/06 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : DesignAlgorithm # File : Const.cs */ using System; using System.Collections.Generic; using System.Text; namespace CSharpAlgorithms.Greedy.Common { /// summary /// 全局精度常量 /// /summary public static class Const { public const int CaratDecimal 3; public const int MoneyDecimal 2; public const double Eps 1e-6; } } /* # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 Greedy Algorithm 贪心算法 # Author : geovindu,Geovin Du 涂聚文. # IDE : vs2026 c# .net 10 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/07/06 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : DesignAlgorithm # File : Erro.cs */ using System; using System.Collections.Generic; using System.Text; namespace CSharpAlgorithms.Greedy.Common { /// summary /// 自定义业务异常 /// /summary public class GemBaseException : Exception { public GemBaseException(string msg) : base($珠宝配石异常{msg}) { } } /// summary /// 参数非法克拉/价格小于等于0 /// /summary public class GemParamInvalidException : GemBaseException { public GemParamInvalidException(string msg) : base($参数非法{msg}) { } } /// summary /// 预算为0或负数 /// /summary public class BudgetZeroException : GemBaseException { public BudgetZeroException() : base(预算必须大于0) { } } /// summary /// 库存无宝石 /// /summary public class StockEmptyException : GemBaseException { public StockEmptyException() : base(宝石库存为空无法执行配石) { } } } /* # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 Greedy Algorithm 贪心算法 # Author : geovindu,Geovin Du 涂聚文. # IDE : vs2026 c# .net 10 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/07/06 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : DesignAlgorithm # File : Util.cs */ using System; using System.Collections.Generic; using System.Text; namespace CSharpAlgorithms.Greedy.Common { /// summary /// 克拉、金额四舍五入工具 /// /summary public static class Util { /// summary /// 克拉保留3位小数 /// /summary /// param nameval/param /// returns/returns public static double RoundCarat(double val) { var mul Math.Pow(10, Const.CaratDecimal); return Math.Round(val * mul) / mul; } /// summary /// 金额保留2位小数 /// /summary /// param nameval/param /// returns/returns public static double RoundMoney(double val) { var mul Math.Pow(10, Const.MoneyDecimal); return Math.Round(val * mul) / mul; } } } /* # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 Greedy Algorithm 贪心算法 # Author : geovindu,Geovin Du 涂聚文. # IDE : vs2026 c# .net 10 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/07/06 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : DesignAlgorithm # File : GemAllocateItem.cs */ using System; using System.Collections.Generic; using System.Text; namespace CSharpAlgorithms.Greedy.Entity { /// summary /// 配石明细 /// /summary public class GemAllocateItem { /// summary /// /// /summary public string StoneName { get; set; } /// summary /// /// /summary public double UseCarat { get; set; } /// summary /// /// /summary public double UseCost { get; set; } } } /* # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 Greedy Algorithm 贪心算法 # Author : geovindu,Geovin Du 涂聚文. # IDE : vs2026 c# .net 10 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/07/06 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : DesignAlgorithm # File : GemAllocateResultDTO.cs */ using System; using System.Collections.Generic; using System.Text; using CSharpAlgorithms.Greedy.Common; namespace CSharpAlgorithms.Greedy.Entity { /// summary /// 对外返回DTO /// /summary public class GemAllocateResultDTO { /// summary /// /// /summary public double BudgetTotal { get; set; } /// summary /// / /// /summary public double CostActual { get; set; } /// summary /// /// /summary public double BudgetRemain { get; set; } /// summary /// /// /summary public double TotalCarat { get; set; } /// summary /// /// /summary public ListGemAllocateItem DetailList { get; set; } new ListGemAllocateItem(); /// summary /// 转字典输出结构与Python/Go完全一致 /// /summary public Dictionarystring, object ToDict() { var detail DetailList.Select(item new Dictionarystring, object { [宝石名称] item.StoneName, [取用克拉] Util.RoundCarat(item.UseCarat), [花费金额] Util.RoundMoney(item.UseCost) }).ToList(); return new Dictionarystring, object { [预算总额] Util.RoundMoney(BudgetTotal), [实际花费] Util.RoundMoney(CostActual), [剩余预算] Util.RoundMoney(BudgetRemain), [总匹配克拉] Util.RoundCarat(TotalCarat), [选用裸石明细] detail }; } } } /* # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 Greedy Algorithm 贪心算法 # Author : geovindu,Geovin Du 涂聚文. # IDE : vs2026 c# .net 10 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/07/06 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : DesignAlgorithm # File : GemStone.cs */ using System; using System.Collections.Generic; using System.Text; namespace CSharpAlgorithms.Greedy.Entity { /// summary /// 库存宝石实体 /// /summary public class GemStone { /// summary /// 宝石名称 /// /summary public string StoneName { get; set; } /// summary /// 批次总克拉 /// /summary public double TotalCarat { get; set; } /// summary /// 整批总价 /// /summary public double BatchPrice { get; set; } /// summary /// 单位预算对应克拉性价比排序指标 /// /summary public double UnitCaratValue TotalCarat / BatchPrice; } } /* # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 Greedy Algorithm 贪心算法 # Author : geovindu,Geovin Du 涂聚文. # IDE : vs2026 c# .net 10 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/07/06 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : DesignAlgorithm # File : GemMemoryRepo.cs */ using CSharpAlgorithms.Greedy.Entity; using System; using System.Collections.Generic; using System.Text; namespace CSharpAlgorithms.Greedy.Repository { /// summary /// 内存仓储实现 /// /summary public class GemMemoryRepo : IBaseGemRepo { private readonly ListGemStone _storage new ListGemStone(); /// summary /// /// /summary /// param namegem/param public void AddGem(GemStone gem) { _storage.Add(gem); } /// summary /// /// /summary /// returns/returns public ListGemStone GetAllGems() { // 返回拷贝防止外部篡改内部集合 return new ListGemStone(_storage); } /// summary /// /// /summary public void ClearAll() { _storage.Clear(); } /// summary /// /// /summary /// returns/returns public int Count() { return _storage.Count; } } } /* # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 Greedy Algorithm 贪心算法 # Author : geovindu,Geovin Du 涂聚文. # IDE : vs2026 c# .net 10 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/07/06 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : DesignAlgorithm # File : IBaseGemRepo.cs */ using CSharpAlgorithms.Greedy.Entity; using System; using System.Collections.Generic; using System.Text; namespace CSharpAlgorithms.Greedy.Repository { /// summary /// 仓储抽象接口 /// /summary public interface IBaseGemRepo { void AddGem(GemStone gem); ListGemStone GetAllGems(); void ClearAll(); int Count(); } } /* # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 Greedy Algorithm 贪心算法 # Author : geovindu,Geovin Du 涂聚文. # IDE : vs2026 c# .net 10 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/07/06 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : DesignAlgorithm # File : GemAllocateService.cs */ using CSharpAlgorithms.Greedy.Algorithm; using CSharpAlgorithms.Greedy.Common; using CSharpAlgorithms.Greedy.Entity; using CSharpAlgorithms.Greedy.Repository; using System; using System.Collections.Generic; using System.Text; namespace CSharpAlgorithms.Greedy.Service { /// summary /// 业务门面服务层 /// /summary public class GemAllocateService { private readonly IBaseGemRepo _repo; private readonly IBaseGreedy _alg; // 依赖注入 public GemAllocateService(IBaseGemRepo repo, IBaseGreedy alg) { _repo repo; _alg alg; } /// summary /// 添加库存宝石统一参数校验 /// /summary /// param namestoneName/param /// param nametotalCarat/param /// param namebatchPrice/param /// exception crefGemParamInvalidException/exception public void AddStoneStock(string stoneName, double totalCarat, double batchPrice) { if (totalCarat Const.Eps || batchPrice Const.Eps) throw new GemParamInvalidException($宝石[{stoneName}]克拉/价格必须大于0); var gem new GemStone { StoneName stoneName, TotalCarat totalCarat, BatchPrice batchPrice }; _repo.AddGem(gem); } /// summary /// 执行业务配石完整流程 /// /summary /// param namebudget/param /// returns/returns /// exception crefStockEmptyException/exception public GemAllocateResultDTO Allocate(double budget) { var gemList _repo.GetAllGems(); if (gemList.Count 0) throw new StockEmptyException(); var items _alg.Calculate(gemList, budget); double totalCarat 0; double totalCost 0; foreach (var item in items) { totalCarat item.UseCarat; totalCost item.UseCost; } double remain budget - totalCost; return new GemAllocateResultDTO { BudgetTotal budget, CostActual totalCost, BudgetRemain remain, TotalCarat totalCarat, DetailList items }; } /// summary /// 清空库存复用服务实例处理下一笔订单 /// /summary public void ClearStock() { _repo.ClearAll(); } } } /* # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 Greedy Algorithm 贪心算法 # Author : geovindu,Geovin Du 涂聚文. # IDE : vs2026 c# .net 10 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/07/06 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : DesignAlgorithm # File : GemFractionGreedy.cs */ using CSharpAlgorithms.Greedy.Common; using CSharpAlgorithms.Greedy.Entity; using System; using System.Collections.Generic; using System.Text; namespace CSharpAlgorithms.Greedy.Algorithm { /// summary /// 分数背包贪心核心 /// /summary public class GemFractionGreedy : IBaseGreedy { private readonly ISortStrategy _sortStrategy; /// summary /// /// /summary /// param namesortStrategy/param public GemFractionGreedy(ISortStrategy sortStrategy null) { _sortStrategy sortStrategy ?? new UnitValueDescStrategy(); } /// summary /// /// /summary /// param namegemList/param /// param namebudget/param /// returns/returns /// exception crefBudgetZeroException/exception public ListGemAllocateItem Calculate(ListGemStone gemList, double budget) { if (budget Const.Eps) throw new BudgetZeroException(); var sorted _sortStrategy.Sort(gemList); double remainBudget budget; var result new ListGemAllocateItem(); foreach (var gem in sorted) { if (remainBudget Const.Eps) break; double useCarat, useCost; if (gem.BatchPrice remainBudget) { useCarat gem.TotalCarat; useCost gem.BatchPrice; } else { double ratio remainBudget / gem.BatchPrice; useCarat gem.TotalCarat * ratio; useCost remainBudget; } result.Add(new GemAllocateItem { StoneName gem.StoneName, UseCarat useCarat, UseCost useCost }); remainBudget - useCost; } return result; } } } /* # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 Greedy Algorithm 贪心算法 # Author : geovindu,Geovin Du 涂聚文. # IDE : vs2026 c# .net 10 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/07/06 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : DesignAlgorithm # File : IBaseGreedy.cs */ using CSharpAlgorithms.Greedy.Entity; using System; using System.Collections.Generic; using System.Text; namespace CSharpAlgorithms.Greedy.Algorithm { /// summary /// 贪心算法顶层接口 /// /summary public interface IBaseGreedy { ListGemAllocateItem Calculate(ListGemStone gemList, double budget); } } /* # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 Greedy Algorithm 贪心算法 # Author : geovindu,Geovin Du 涂聚文. # IDE : vs2026 c# .net 10 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/07/06 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : DesignAlgorithm # File : ISortStrategy.cs */ using CSharpAlgorithms.Greedy.Entity; using System; using System.Collections.Generic; using System.Text; namespace CSharpAlgorithms.Greedy.Algorithm { /// summary /// 排序策略抽象 /// /summary public interface ISortStrategy { ListGemStone Sort(ListGemStone gemList); } } /* # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 Greedy Algorithm 贪心算法 # Author : geovindu,Geovin Du 涂聚文. # IDE : vs2026 c# .net 10 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/07/06 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : DesignAlgorithm # File : MaxCaratDescStrategy.cs */ using CSharpAlgorithms.Greedy.Entity; using System; using System.Collections.Generic; using System.Text; namespace CSharpAlgorithms.Greedy.Algorithm { /// summary /// 扩展策略优先大克拉宝石 /// /summary public class MaxCaratDescStrategy : ISortStrategy { public ListGemStone Sort(ListGemStone gemList) { return gemList .OrderByDescending(g g.TotalCarat) .ToList(); } } } /* # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 Greedy Algorithm 贪心算法 # Author : geovindu,Geovin Du 涂聚文. # IDE : vs2026 c# .net 10 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/07/06 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : DesignAlgorithm # File : UnitValueDescStrategy.cs */ using CSharpAlgorithms.Greedy.Entity; using System; using System.Collections.Generic; using System.Text; namespace CSharpAlgorithms.Greedy.Algorithm { /// summary /// 默认策略性价比从高到低 /// /// /summary public class UnitValueDescStrategy : ISortStrategy { public ListGemStone Sort(ListGemStone gemList) { return gemList .OrderByDescending(g g.UnitCaratValue) .ToList(); } } }调用/* # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 Greedy Algorithm 贪心算法 # Author : geovindu,Geovin Du 涂聚文. # IDE : vs2026 c# .net 10 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/07/06 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : DesignAlgorithm # File : GreedyBll.cs */ using CSharpAlgorithms.Greedy.Algorithm; using CSharpAlgorithms.Greedy.Common; using CSharpAlgorithms.Greedy.Repository; using CSharpAlgorithms.Greedy.Service; using System; using System.Collections.Generic; using System.Text; using System.Text.Encodings.Web; using System.Text.Json; namespace CSharpAlgorithms.Bll { /// summary /// /// /summary public class GreedyBll { // 全局统一Json配置关闭中文Unicode转义、格式化输出 private static readonly JsonSerializerOptions _jsonOpts new JsonSerializerOptions { WriteIndented true, // 使用不转义的编码器中文直接输出 Encoder JavaScriptEncoder.UnsafeRelaxedJsonEscaping }; static void DemoCase1() { Console.WriteLine( 案例1性价比优先配石结果 ); IBaseGemRepo repo new GemMemoryRepo(); IBaseGreedy alg new GemFractionGreedy(); var svc new GemAllocateService(repo, alg); svc.AddStoneStock(0.8ct白钻, 0.8, 10500); svc.AddStoneStock(0.5ct白钻, 0.5, 6800); svc.AddStoneStock(0.3ct白钻, 0.3, 4200); svc.AddStoneStock(0.2ct粉钻, 0.2, 2800); var dto svc.Allocate(18000); var dict dto.ToDict(); // 使用自定义配置序列化 string json JsonSerializer.Serialize(dict, _jsonOpts); Console.WriteLine(json); } static void DemoCase2() { Console.WriteLine(\n 案例2优先大克拉配石结果 ); IBaseGemRepo repo new GemMemoryRepo(); ISortStrategy bigCaratSort new MaxCaratDescStrategy(); IBaseGreedy alg new GemFractionGreedy(bigCaratSort); var svc new GemAllocateService(repo, alg); svc.AddStoneStock(0.8ct白钻, 0.8, 10500); svc.AddStoneStock(0.5ct白钻, 0.5, 6800); var dto svc.Allocate(12000); var dict dto.ToDict(); string json JsonSerializer.Serialize(dict, _jsonOpts); Console.WriteLine(json); } /// summary /// /// /summary public void Demo() { try { DemoCase1(); DemoCase2(); } catch (GemBaseException ex) { Console.WriteLine($业务异常{ex.Message}); } catch (Exception ex) { Console.WriteLine($系统异常{ex.Message}); } } } }输出