使用SymPy(或其他Python工具)解决“硬币”难题?

时间:2017-04-17 09:37:29

标签: sympy

一位朋友提出了以下谜题(来自现实生活经历)。他有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逻辑编程工具或框架来实现这一目标?

0 个答案:

没有答案