Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 给定一个整数数组和一个值N。将N表示为该数组的最小元素数之和。如何处理这个问题?_Arrays_Algorithm - Fatal编程技术网

Arrays 给定一个整数数组和一个值N。将N表示为该数组的最小元素数之和。如何处理这个问题?

Arrays 给定一个整数数组和一个值N。将N表示为该数组的最小元素数之和。如何处理这个问题?,arrays,algorithm,Arrays,Algorithm,假设给定一个数组A={1,3,10,11,20}和一个值N。现在,我的任务是将N表示为数组a的最小元素数之和 注意:表示中可能出现一个或多个数组元素。但是,表示的总长度必须是最小的 让N=5。这里的答案是{1,1,3}。这里表示的长度是3。我不可能得到更短的长度表示。因此,这是N=5的答案 另一个例子:如果N=8,那么最短的表示是{1,1,3,3} 我认为这个问题应该用动态规划来解决。但是,我想不出任何主意。我应该如何处理这个问题呢?这看起来像是家庭作业,所以我不会给出全部答案,但这里有一个可以

假设给定一个数组
A={1,3,10,11,20}
和一个值
N
。现在,我的任务是将
N
表示为数组
a
的最小元素数之和

注意:表示中可能出现一个或多个数组元素。但是,表示的总长度必须是最小的

N=5
。这里的答案是
{1,1,3}
。这里表示的长度是3。我不可能得到更短的长度表示。因此,这是
N=5
的答案

另一个例子:如果
N=8
,那么最短的表示是
{1,1,3,3}


我认为这个问题应该用动态规划来解决。但是,我想不出任何主意。我应该如何处理这个问题呢?

这看起来像是家庭作业,所以我不会给出全部答案,但这里有一个可以使用的策略

这个问题有点像在您想要返还最小数量的硬币时进行更改

例如,如果你有无限多的
{1¢5¢25¢​
硬币,你想换37​,你可以提供25​+5​+5​+1​+1​,总共5枚硬币

现在,如果你也有7美分的硬币,那么你的选择是从
{1美分,5美分,7美分,25美分
?现在,您可以使用25美分+7美分+5美分,总共3枚硬币

这可能意味着我们可以从最大的硬币大小倒推到最小的硬币大小<但这是不正确的。< /强>考虑如果我们有<代码> { 1美分,3美分,4美分} /代码>会发生什么,我们要代表6美分。我们将为总共3枚硬币提供
4×+1×+1×
,但最短的答案实际上是
3×+3×

因此,天真/贪婪的方法并不总是能让我们得到正确的答案;我们需要使用动态规划之类的东西

动态规划方法可以采用多种形式,但需要使用两种关键见解:

  • 最优子结构:你改变x¢的方式有助于理解你改变x¢+n¢的方式

  • 重叠子问题:当考虑大于x的值时,您对x的更改方式可能会被计算多次。您能否重复使用这些计算以避免重复执行这些工作


如果您陷入困境,可以概述一种方法。希望有帮助

这看起来像是家庭作业,所以我不会给出全部答案,但这里有一个可以使用的策略

这个问题有点像在您想要返还最小数量的硬币时进行更改

例如,如果你有无限多的
{1¢5¢25¢​
硬币,你想换37​,你可以提供25​+5​+5​+1​+1​,总共5枚硬币

现在,如果你也有7美分的硬币,那么你的选择是从
{1美分,5美分,7美分,25美分
?现在,您可以使用25美分+7美分+5美分,总共3枚硬币

这可能意味着我们可以从最大的硬币大小倒推到最小的硬币大小<但这是不正确的。< /强>考虑如果我们有<代码> { 1美分,3美分,4美分} /代码>会发生什么,我们要代表6美分。我们将为总共3枚硬币提供
4×+1×+1×
,但最短的答案实际上是
3×+3×

因此,天真/贪婪的方法并不总是能让我们得到正确的答案;我们需要使用动态规划之类的东西

动态规划方法可以采用多种形式,但需要使用两种关键见解:

  • 最优子结构:你改变x¢的方式有助于理解你改变x¢+n¢的方式

  • 重叠子问题:当考虑大于x的值时,您对x的更改方式可能会被计算多次。您能否重复使用这些计算以避免重复执行这些工作


如果您陷入困境,可以概述一种方法。希望有帮助

@GBlodgett这是一种仅适用于非常特殊情况的方法。例如,如果你想表示
6
,而你有
[1,3,4]
,你的方法会说答案是
4+1+1
,但正确的答案实际上是
3+3
@JohnFeminella是的,我刚才意识到可能的重复是用最少数量的硬币进行更改的问题。这在网上有很好的记录。现在您已经有了一些经典的关键字,您应该能够研究解决方案了。@GBlodgett这是一种只适用于非常特定情况的方法。例如,如果你想表示
6
,而你有
[1,3,4]
,你的方法会说答案是
4+1+1
,但正确的答案实际上是
3+3
@JohnFeminella是的,我刚才意识到可能的重复是用最少数量的硬币进行更改的问题。这在网上有很好的记录。既然你有了一些经典的关键词,你应该能够研究一个解决方案。我已经能够使用动态规划计算出改变所需的最小硬币数量。我如何打印这些硬币?我已经能够使用动态规划计算更改所需的最小硬币数量。我怎么印那些硬币?