我有一个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
答案 0 :(得分:1)
很容易找到一个反例(见评论)。
现在,解决方案是动态编程方法:
所有算术都是模10 ^ n。对于0 - 10 ^ n-1范围内的每个值,您需要一个标志,无论是否找到它,您需要一个队列来处理元素。
如果您存储了数字的存储方式,则可以重建实际解决方案。你只需要从总和中走回来,直到达到初始值。
答案 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.是的,有效。