一位朋友提出了以下谜题(来自现实生活经历)。他有17个硬币,他交换了四个季度(洗衣日)。
这些钱币可能是什么?
另一位朋友使用以下Mathematica™解决了这个问题:
Reduce[{
25 q + 10 d + 5 n + p == 75,
q + d + n + p == 17,
q \[Element] Integers, d \[Element] Integers,
n \[Element] Integers, p \[Element] Integers,
q >= 0, d >= 0, n >= 0, p >= 0
}]
...我希望能够使用Python的SymPy(如果可能)或其他工具(例如pyDatalog或{{3})来解决它(好吧,这类问题)或者其他什么。
然而,我不知道如何连接点。我得到(甚至在看到Mathematica解决方案之前)它是一个由两个方程组成的系统:
#!python
import sympy
from sympy import Symbol, Eq
from sympy.solvers import solve
d = Symbol('d', integer=True) # Dimes
n = Symbol('n', integer=True) # Nickels
p = Symbol('p', integer=True) # Pennies
## Assuming he didn't trade quarters for more quarters
f1 = Eq(d + n + p, 17) # Number of coins he had
f2 = Eq(d * 10 + n * 5 + p, 75) # Total value of the coins
但我不知道怎么去那里。当我打电话给solve()
时,我得到:
#!python
solve((f1, f2), (d, n, p))
# ---> {n: -9*p/5 + 19, d: 4*p/5 - 2}
(作为参考,我知道我应该得到几种不同的可能解决方案:(d,n,p)=>(2,10,5),(6,1,10)...还有另一个这违反了我的约束条件,他不会在季度交换季度。)
我确信这只是我对这个工具不太了解。
那么,我如何解决Sympy中的方程组,其约束条件是结果为非负整数?或者,我如何使用Python逻辑编程工具或框架来实现这一目标?