这可能吗?总和的最后几位数等于另一个数字

时间:2013-06-07 02:30:41

标签: algorithm math numbers

我有一个n位数字和一个数字列表,任何数字都可以使用任意次数。

从列表中取数字,我怎么知道可以生成一个总和,使得和的最后n位是n位数?

注意:总和有一些初始值,它不是零。

编辑 - 如果存在解决方案,我需要找到添加的最小数字以获得一个数字,使其最后4位数作为给定数字。用DP(最小硬币更换问题)很容易解决。

例如,如果n = 4,

Given number  = 1212
Initial value = 5234
List = [1023, 101, 1]
A solution exists: 21212 = 5234 + 1023*15 + 101*6 + 1*27

2 个答案:

答案 0 :(得分:1)

很容易找到一个反例(见评论)。

现在,解决方案是动态编程方法:

所有算术都是模10 ^ n。对于0 - 10 ^ n-1范围内的每个值,您需要一个标志,无论是否找到它,您需要一个队列来处理元素。

  1. 将初始值推送到待处理列表。
  2. 从待处理列表中获取元素。如果是空的,完成。没有解决方案。
  3. 尝试将每个号码分别添加到此号码。如果它已经找到,那就无所事事了。如果找到了总和,那么你已经完成,有一个解决方案。如果没有,请将其标记为已找到并将其推送到队列中。
  4. 转到2
  5. 如果您存储了数字的存储方式,则可以重建实际解决方案。你只需要从总和中走回来,直到达到初始值。

答案 1 :(得分:0)

如果列表中数字的最大公因子是一个单位模数10 n (也就是说,不能被2或5整除),你可以解决问题,因为任何选择的另一个给定值:使用扩展的Euclid算法找到与gcf求和的列表的线性组合,找到gcf模10&sup> n 的乘法逆并乘以给定值和初始值之间的差值

如果列表中数字的gcf可以被2或5整除(也就是说,不是一个单位),并且给定值和初始值之间的差值也可以被2或5整除,则将数字除以列表和2和5的最大权力的差异,将它们全部分开。如果您最终得到的gcf是一个单位,则有一个解决方案,您可以通过上述步骤找到它。否则没有解决方案。

例如,给定16和和5的初始值,以及数字列表[3]。

列表中数字的gcf是3,它是一个单位。其逆模100为67(3×67 = 201)。

乘以给定数字和初始值之间的差值16-5 = 11得到因子67 * 11 = 737为3.因为我们的模数100与37相同。

检查结果:5 + 37×3 = 16.是的,有效。