硬币兑换的空间优化解决方案

2024-05-05

给定一个值 N,如果我们想要找 N 分钱,并且我们有无限供应每种 S = { S1, S2, .. , Sm} 价值的硬币,我们可以有多少种找零方式?硬币的顺序并不重要。

例如,对于 N = 4 且 S = {1,2,3},有四种解:{1,1,1,1},{1,1,2},{2,2},{1, 3}。所以输出应该是4。对于N = 10且S = {2,5,3,6},有五个解:{2,2,2,2,2},{2,2,3,3}, {2,2,6}、{2,3,5} 和 {5,5}。所以输出应该是5。

我找到了3种方法HERE http://www.geeksforgeeks.org/dynamic-programming-set-7-coin-change/。但无法理解仅使用一维数组 table[] 的空间优化动态编程方法。

int count( int S[], int m, int n )
{
    // table[i] will be storing the number of solutions for
    // value i. We need n+1 rows as the table is consturcted
    // in bottom up manner using the base case (n = 0)
    int table[n+1];

    // Initialize all table values as 0
    memset(table, 0, sizeof(table));

    // Base case (If given value is 0)
    table[0] = 1;

    // Pick all coins one by one and update the table[] values
    // after the index greater than or equal to the value of the
    // picked coin
    for(int i=0; i<m; i++)
        for(int j=S[i]; j<=n; j++)
            table[j] += table[j-S[i]];

    return table[n];
}

首先注意table[i]是当N=i时硬币找零的方式数。

给定算法根据给定的一组硬币 (S[]) 填充此数组 (table[])。 最初,table[] 中的所有值都初始化为 0。并且 table[0] 设置为 0(这是基本情况 N=0)。

每个硬币按以下方式将表[]中的值相加。

对于价值 X 的硬币,以下是对表 [] 的更新 -

  1. 表[X] = 表[X] + 1

    这很容易理解。具体来说,这会添加解决方案 {X}。

  2. 对于所有 Y > X

    表[Y] = 表[Y] + 表[Y-X]

    这很难理解。以 X = 3 为例,并考虑 Y = 4 的情况。

    4 = 3 + 1 即 4 可以通过组合 3 和 1 得到。根据定义,得到 1 的方法有表[1]。因此表[4]中添加了许多方法。这就是为什么上面的表达式使用 table[Y-X]。

算法中的以下行代表相同的内容(以上两个步骤) -

table[j] += table[j-S[i]];  

在算法结束时,table[n] 包含 n 的解。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

硬币兑换的空间优化解决方案 的相关文章

随机推荐

  • Phonegap:WebSql 还是 SqLite?

    我使用phonegap的时间很短 并且我对其中的存储概念遇到了一些麻烦 因此 文档指出您可以打开这个数据库 它是一个 SQLite 实现 window openDatabase 返回一个新的数据库对象 此方法将创建一个新的 SQL Lite
  • 一览 根本不工作

    我安装了MVC5 概览 https www nuget org packages Glimpse Mvc5 via Install Package Glimpse MVC5 我在 Glimpse 配置页面上打开了 Glimpse Glimp
  • Aptana Studio 与 Eclipse [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何仅在视口中显示数据

    我打算使用一个名为的 jQuery 插件图表 js http www chartjs org 用于图形和图表 然而 在较大的页面上 这些图表的动画甚至在用户看到它们之前就已经完成了 我的问题是 只有当特定 div 部分的内容在视口内可见时
  • 真=假==真[重复]

    这个问题在这里已经有答案了 可能的重复 为什么 Python 不能按照我的预期处理真 假值 https stackoverflow com questions 2055029 why cant python handle true fals
  • Laravel 表单标签中内联“必需”星号

    我正在尝试为 Laravel 中的必填字段添加红色星号 但我不确定如何将它们添加到标签中 我目前正在做的是 Form label took act or sat Did you or will you take the SAT or ACT
  • 部署应用程序引擎后的暂存文件桶

    部署谷歌应用引擎后 谷歌云存储中至少创建了4个存储桶 项目 ID appspot com 登台 项目 ID appspot com 工件 project id appspot com vm containers 项目 ID appspot
  • ASP.NET MVC 4 会话超时

    我正在使用 VS 2012 IIS 7 5 开发一个带有 ASP NET MVC4 的互联网应用程序 我正在使用表单身份验证 我的网络配置中的设置如下
  • ASP.NET MVC 中的缩小操作筛选器属性

    我有一个返回大量动态 JavaScript 的控制器操作 一次向客户端提供服务 并且我已经启用了 GZip 压缩 我想做的一件事是读取执行的结果流并对其应用 JS 缩小 是否可以使用操作过滤器属性来做到这一点 我认为我的问题可以归结为 假设
  • PHP 中的 Rss 阅读器

    header Access Control Allow Origin tmpFile tmpFile txt val http rss news yahoo com rss topstories curlHandle curl init v
  • linq-to-sql:存储过程不能在查询中使用

    这在 VS2010 RC LINQ to SQL 上失败 并出现 InvalidOperationException 存储过程不能在查询内使用 var foo from a in aTable from b in this SomeStor
  • Maven 找不到 .git (dotGitDirectory)

    我有一个与所问问题类似的问题here https stackoverflow com questions 31159484 mavengit commit id plugin git directory could not be found
  • 将数据传递给视图时,node ejs 引用错误数据未在 eval 处定义

    我已经接近使用express和ejs的节点应用程序 但是当我尝试将数据从控制器传递到我的视图时 如下所示 var myData theData data res render path join dirname views index my
  • 在布局的右侧和底部添加阴影

    我想在布局的右侧和底部添加光阴影 我尝试使用android background android drawable dialog holo light frame 但它在布局的所有四个侧面添加了厚厚的阴影 我需要创建什么可绘制并将其设置为背
  • WPF TextBlock 元素和 Label 控件有什么区别? [复制]

    这个问题在这里已经有答案了 从视觉上看 以下两个片段都生成相同的 UI 那么为什么有2个控件 Snippet1
  • Radio r = Radio("PSR", 100.8) 和 Radio("PSR", 100.8) 有什么区别? [复制]

    这个问题在这里已经有答案了 我是 C 新手 正在尝试理解一些东西 我的 main cpp 中有这段代码 Radio r Radio PSR 100 8 或该代码 Radio r PSR 100 8 两者似乎都有效并且做同样的事情 那么有什么
  • 在 Javascript 中设置多个 cookie

    我正在尝试设置多个 cookiedocument cookie 但不幸的是只有一个被添加 我知道网上有多个设置此类 cookie 的示例 我遵循了其中之一 但我仍然无法解决这个问题 我跟着这个link http www elated com
  • 使用geom_sf时向ggplot2添加多个图例

    我的问题结合了之前在 Stackoverflow 上发布的两个单独的问题 向 ggplot 添加多个图例 https stackoverflow com questions 26443371 adding multiple legends
  • 在 v8 中向全局对象原型添加函数模板

    在V8中 我想通过添加一些函数来修改全局内置Array对象的原型 在 JavaScript 中 我会这样做 例如 Array prototype sum function calculate sum of array values 如何在
  • 硬币兑换的空间优化解决方案

    给定一个值 N 如果我们想要找 N 分钱 并且我们有无限供应每种 S S1 S2 Sm 价值的硬币 我们可以有多少种找零方式 硬币的顺序并不重要 例如 对于 N 4 且 S 1 2 3 有四种解 1 1 1 1 1 1 2 2 2 1 3