1. /// <summary>
  2. /// 金额的 动态分配算法
  3. /// </summary>
  4. public static void FindCosts()
  5. {
  6. // 定义费用明细列表
  7. List<(decimal amount, string name)> costDetails = new List<(decimal, string)> {
  8. (10.50M, "Item 1"),
  9. (20.00M, "Item 2"),
  10. (5.00M, "Item 3"),
  11. (3.00M, "Item 4"),
  12. (12.75M, "Item 5")
  13. };
  14. // 定义总金额
  15. decimal totalAmount = 30.50M;
  16. // 定义动态规划表格
  17. bool[,] dp = new bool[costDetails.Count + 1, (int)(totalAmount * 100) + 1];
  18. // 初始化表格
  19. for (int i = 0; i <= costDetails.Count; i++)
  20. {
  21. dp[i, 0] = true;
  22. }
  23. // 填充表格
  24. for (int i = 1; i <= costDetails.Count; i++)
  25. {
  26. for (int j = 1; j <= (int)(totalAmount * 100); j++)
  27. {
  28. if (costDetails[i - 1].amount * 100 <= j)
  29. {
  30. dp[i, j] = dp[i - 1, j] || dp[i - 1, j - (int)(costDetails[i - 1].amount * 100)];
  31. }
  32. else
  33. {
  34. dp[i, j] = dp[i - 1, j];
  35. }
  36. }
  37. }
  38. // 找到符合条件的费用明细
  39. List<(decimal amount, string name)> result = new List<(decimal, string)>();
  40. int row = costDetails.Count;
  41. int col = (int)(totalAmount * 100);
  42. while (row > 0 && col > 0)
  43. {
  44. if (dp[row, col] && !dp[row - 1, col])
  45. {
  46. result.Add(costDetails[row - 1]);
  47. col -= (int)(costDetails[row - 1].amount * 100);
  48. }
  49. row--;
  50. }
  51. // 输出结果
  52. if (result.Count > 0)
  53. {
  54. Console.WriteLine("成本加起来等于{0:C}的细节:", totalAmount);
  55. foreach ((decimal amount, string name) in result)
  56. {
  57. Console.WriteLine("{0:C}\t{1}", amount, name);
  58. }
  59. }
  60. else
  61. {
  62. Console.WriteLine("没有成本细节{0:C}", totalAmount);
  63. }
  64. }

C# 金额的 动态分配算法的更多相关文章

  1. java使用BigDecimal 实现随机金额红包拆分算法

    原创代码,引用注明出处:https://www.cnblogs.com/guangxiang/p/12218714.html @Servicepublic class SplitRedPacketsS ...

  2. JAVA实现拼手气红包算法

    实现拼手气红包算法,有以下几个需要注意的地方: 抢红包的期望收益应与先后顺序无关 保证每个用户至少能抢到一个预设的最小金额,人民币红包设置的最小金额一般是0.01元,如果需要发其他货币类型的红包,比如 ...

  3. 复利计算器(软件工程)及Junit测试———郭志豪

    计算:1.本金为100万,利率或者投资回报率为3%,投资年限为30年,那么,30年后所获得的利息收入:按复利计算公式来计算就是:1,000,000×(1+3%)^30 客户提出: 2.如果按照单利计算 ...

  4. 人人都是 DBA(IV)SQL Server 内存管理

    SQL Server 的内存管理是一个庞大的主题,涉及特别多的概念和技术,例如常见的 Plan Cache.Buffer Pool.Memory Clerks 等.本文仅是管中窥豹,描述常见的内存管理 ...

  5. Java开源生鲜电商平台-账单模块的设计与架构(源码可下载)

    Java开源生鲜电商平台-账单模块的设计与架构(源码可下载) 补充说明:Java开源生鲜电商平台-账单模块的设计与架构,即用户的账单形成过程. 由于系统存在一个押账功能的需求,(何为押账,就是形成公司 ...

  6. 某某水表-M1卡数据算法分析

    # 某某水表-M1卡数据算法分析 ## 卡片数据-----------------------------扇区数据 | 金额:--- |:---13EC 0000 0000 0000 0000 000 ...

  7. Internet接入方式

    (转载) 接入网可以大概分成两类:拨号上网(包括ASDL)与专线上网 在接入网中,目前可供选择的接入方式主要有PSTN.ISDN.DDN.LAN.ADSL.VDSL.Cable-Modem.PON和L ...

  8. 内存分配器 (Memory Allocator)

    对于大多数开发人员而言,系统的内存分配就是一个黑盒子,就是几个API的调用.有你就给我,没有我就想别的办法. 来UC前,我就是这样觉得的.实际深入进去时,才发现这个领域里也是百家争鸣.非常热闹.有操作 ...

  9. ucoreOS_lab2 实验报告

    所有的实验报告将会在 Github 同步更新,更多内容请移步至Github:https://github.com/AngelKitty/review_the_national_post-graduat ...

  10. 【1】Embarrassingly Parallel(易并行计算问题)

    1.什么是Embarrassingly Parallel(易并行计算问题) 易并行计算问题:A computation that can be divided into a number of  co ...

随机推荐

  1. 启动MySQL5.7服务无法启动或Table 'mysql.plugin' doesn't exist

    首先说一下我这个是mysql5.7.16免安装版,不过这个问题对于5.7版本应该都适用. 问题重现: 安装过程也说一下吧: 1.将下载的压缩文件解压到指定目录,     我的是:E:\program\ ...

  2. 【Azure API 管理】Azure API Management通过请求中的Path来限定其被访问的频率(如1秒一次)

    问题描述 Azure API Management 是否可以通过请求中的Path来限定其被访问的频率? 在系统Request中发现某个Path 在短时间内被频繁的调用,影响了后台服务的性能及安全,所以 ...

  3. dart特殊符号语法(一)

    许久没有写博客.浏览以往的博客,是那么稚嫩.就让它们当成成长的照片吧.重新开始操起这个记录的爱好,一方面把它当成可以查阅的资料,方便自己:另一方面希望有帮助于人.由于个人能力,认知有限,如读者发现有纰 ...

  4. C# 操作国产数据库之【 人大金仓 】之四大模式

    人大金仓优点 人大金仓是国产最主流ORM之一 具有和PgSql一样强悍的性能,同时人大金仓支持了四种数据库模式 : Oracle.PgSql.MySql和SqlServer ,假如你们系统有多种数据库 ...

  5. Java //在150之内 是三的倍数 输出Zzz 是5个倍数输出 Lll 是7的倍数输出zlzl

    1 //在150之内 是三的倍数 输出Zzz 是5个倍数输出 Lll 是7的倍数输出zlzl 2 int i =1; 3 for(i = 1; i<=150;i++) 4 { 5 System. ...

  6. Scriban语言手册中文版

    Scriban是一个快速.强大.安全且轻量级的模板引擎,同时兼容liquid语法规则. 项目地址:https://github.com/scriban/scriban 这个文档是语言语法的中文翻译 原 ...

  7. golang开发:环境篇(三)开发利器Goland安装

    这节主要介绍下golang开发的最主要的IDE,Goland.可以有效提高开发效率.用过一段时间 IntelliJ+GO插件,其实功能上跟goland差不多.不过团队的其它开发者基本都是Goland, ...

  8. springboot中使用restTemplate发送带参数和请求头的post,get请求

    最近在工作中使用到了用restTemplate去获取网站数据填入到数据库中,在这里记录下来以便以后使用: 添加相关依赖:版本使用springboot中的 <dependency> < ...

  9. Vue2和ElementUI编写的无限级菜单路由

    Vue2和ElementUI编写的无限级菜单路由 文章转载自:www.javaman.cn <template> <div> <el-menu :default-acti ...

  10. kettle多个表一起迁移-通过配置文件配置需要同步的字段,非全字段同步

    kettle多个表一起迁移-通过配置文件配置需要同步的字段,非全字段同步 欢迎关注博主公众号「Java大师」, 专注于分享Java领域干货文章, 关注回复「999」获取本例源文件, 免费领取全网最热的 ...