C# 金额的 动态分配算法
/// <summary>
/// 金额的 动态分配算法
/// </summary>
public static void FindCosts()
{
// 定义费用明细列表
List<(decimal amount, string name)> costDetails = new List<(decimal, string)> {
(10.50M, "Item 1"),
(20.00M, "Item 2"),
(5.00M, "Item 3"),
(3.00M, "Item 4"),
(12.75M, "Item 5")
};
// 定义总金额
decimal totalAmount = 30.50M;
// 定义动态规划表格
bool[,] dp = new bool[costDetails.Count + 1, (int)(totalAmount * 100) + 1];
// 初始化表格
for (int i = 0; i <= costDetails.Count; i++)
{
dp[i, 0] = true;
}
// 填充表格
for (int i = 1; i <= costDetails.Count; i++)
{
for (int j = 1; j <= (int)(totalAmount * 100); j++)
{
if (costDetails[i - 1].amount * 100 <= j)
{
dp[i, j] = dp[i - 1, j] || dp[i - 1, j - (int)(costDetails[i - 1].amount * 100)];
}
else
{
dp[i, j] = dp[i - 1, j];
}
}
}
// 找到符合条件的费用明细
List<(decimal amount, string name)> result = new List<(decimal, string)>();
int row = costDetails.Count;
int col = (int)(totalAmount * 100);
while (row > 0 && col > 0)
{
if (dp[row, col] && !dp[row - 1, col])
{
result.Add(costDetails[row - 1]);
col -= (int)(costDetails[row - 1].amount * 100);
}
row--;
}
// 输出结果
if (result.Count > 0)
{
Console.WriteLine("成本加起来等于{0:C}的细节:", totalAmount);
foreach ((decimal amount, string name) in result)
{
Console.WriteLine("{0:C}\t{1}", amount, name);
}
}
else
{
Console.WriteLine("没有成本细节{0:C}", totalAmount);
}
}
C# 金额的 动态分配算法的更多相关文章
- java使用BigDecimal 实现随机金额红包拆分算法
原创代码,引用注明出处:https://www.cnblogs.com/guangxiang/p/12218714.html @Servicepublic class SplitRedPacketsS ...
- JAVA实现拼手气红包算法
实现拼手气红包算法,有以下几个需要注意的地方: 抢红包的期望收益应与先后顺序无关 保证每个用户至少能抢到一个预设的最小金额,人民币红包设置的最小金额一般是0.01元,如果需要发其他货币类型的红包,比如 ...
- 复利计算器(软件工程)及Junit测试———郭志豪
计算:1.本金为100万,利率或者投资回报率为3%,投资年限为30年,那么,30年后所获得的利息收入:按复利计算公式来计算就是:1,000,000×(1+3%)^30 客户提出: 2.如果按照单利计算 ...
- 人人都是 DBA(IV)SQL Server 内存管理
SQL Server 的内存管理是一个庞大的主题,涉及特别多的概念和技术,例如常见的 Plan Cache.Buffer Pool.Memory Clerks 等.本文仅是管中窥豹,描述常见的内存管理 ...
- Java开源生鲜电商平台-账单模块的设计与架构(源码可下载)
Java开源生鲜电商平台-账单模块的设计与架构(源码可下载) 补充说明:Java开源生鲜电商平台-账单模块的设计与架构,即用户的账单形成过程. 由于系统存在一个押账功能的需求,(何为押账,就是形成公司 ...
- 某某水表-M1卡数据算法分析
# 某某水表-M1卡数据算法分析 ## 卡片数据-----------------------------扇区数据 | 金额:--- |:---13EC 0000 0000 0000 0000 000 ...
- Internet接入方式
(转载) 接入网可以大概分成两类:拨号上网(包括ASDL)与专线上网 在接入网中,目前可供选择的接入方式主要有PSTN.ISDN.DDN.LAN.ADSL.VDSL.Cable-Modem.PON和L ...
- 内存分配器 (Memory Allocator)
对于大多数开发人员而言,系统的内存分配就是一个黑盒子,就是几个API的调用.有你就给我,没有我就想别的办法. 来UC前,我就是这样觉得的.实际深入进去时,才发现这个领域里也是百家争鸣.非常热闹.有操作 ...
- ucoreOS_lab2 实验报告
所有的实验报告将会在 Github 同步更新,更多内容请移步至Github:https://github.com/AngelKitty/review_the_national_post-graduat ...
- 【1】Embarrassingly Parallel(易并行计算问题)
1.什么是Embarrassingly Parallel(易并行计算问题) 易并行计算问题:A computation that can be divided into a number of co ...
随机推荐
- sql更改表结构并将老数据导入(触发器)
1 --1.旧表改名 2 ALTER TABLE APP_MULTI_PARAM_test RENAME TO APP_MULTI_PARAM_test_bk; 3 4 --2.创建新表 5 CREA ...
- SpringBoot使用令牌桶算法+拦截器+自定义注解+自定义异常实现简单的限流
令牌桶 在高并发的情况下,限流是后端常用的手段之一,可以对系统限流.接口限流.用户限流等,本文就使用令牌桶算法+拦截器+自定义注解+自定义异常实现限流的demo. 令牌桶思想 大小固定的令牌桶可自行以 ...
- django中的一些装饰器用法
1.require_http_methods() 1.要求视图只接受特定的请求方法 2.该装饰器允许传递多个请求方法参数,以列表的形式,请求方法名要大写 from django.views.decor ...
- 【Azure 服务总线】Azure.Messaging.ServiceBus 多次发送消息报超时错误,是否可以配置重新发送?是否有内置重试机制?
问题描述 使用 Azure Service Bus,提供应用程序之间松耦合的消息交换,但是有时候发送消息多次出现超时错误. A connection attempt failed because th ...
- C++ //谓词 //一元谓词 //概念:返回bool类型的仿函数称为 谓词 //如果 operator()接受一个参数,那么叫做一元谓词 //如果 operator()接受 2 个参数,那么叫做一元谓词
1 //谓词 2 //一元谓词 3 //概念:返回bool类型的仿函数称为 谓词 4 //如果 operator()接受一个参数,那么叫做一元谓词 5 //如果 operator()接受 2 个参数, ...
- Win10系统winload.efi丢失或损坏怎么办?修复步骤(以联想笔记本为例)
winload.efi是通过UEFI方式引导必要的引导文件,如果系统中丢失或是损坏将导致系统无法启动,如win10在出现这样的问题时会出现蓝屏恢复界面,那么此时该如何解决呢?此例为 GPT+UEFI ...
- SSRF概述
SSRF(service side request forgery) 1.攻击的目标: 从外网无法访问的内部系统 2.形成的原因: 大部分是由服务器端提供了从其他服务器应用获取数据的功能.且没有对目标 ...
- async await $api vue
async getDataNew () { const res = await this.$api('apiPath') if (res && res.status === 20) { ...
- 基于python的wav转txt的源码
最近在做一个算法的时候,用到了这个转换,这里做一个备忘,希望能给你提供价值. import wave import matplotlib.pyplot as plt import numpy as n ...
- buu第一页复盘
这里就对之前第一遍没写出来的题目再写一次wp 写在之前 贴一下我的模块文件 from pwn import * from LibcSearcher import * from struct impor ...