说我有
a + 3b + 4c +2d =40;
我该如何求解a,b,c和d。 我不确定从哪里开始,我正在使用c语言编写此代码。我知道一种解决方案是a = 9 b = 3 c = 2 d = 7。
我忘记添加a,b,c,d的域为0-29(含0-29)。
答案 0 :(得分:3)
这个问题等同于硬币找零问题-获得数量有限(此处最大为29)的硬币的总和,并带有一些名义金额(此处为1,2,3,4)
进行所有更改的最简单方法是递归生成。
makesum(coinlist, currentsum, resultlist)
if currensum < 0
return
if currensum = 0
print resultlist
for coin in coinlist
makesum(coinlist - coin, currentsum - coinvalue, resultlist + coin)
在特定情况下-少量固定的名义值-您可以制作4个嵌套循环
还存在动态编程方法-用可能的组合填充表[0..sum](要获得所有可能的组合,DP不会更快)
答案 1 :(得分:1)
该方程有无限解,因为它表示4d空间中的一个平面,并且该平面上的所有点都是有效解。
要拥有独特的解决方案,您至少需要4个这样的不同方程式,但仍不能保证之后您将获得针对这些方程组的解决方案。
答案 2 :(得分:1)
由于有效数字的范围较小(0-29),因此您可以使用蛮力,即4个for循环,并打印所有解决方案:
#include <stdio.h>
int main(void) {
for (int a=0; a<30; ++a)
for (int b=0; b<30; ++b)
for (int c=0; c<30; ++c)
for (int d=0; d<30; ++d)
if (a + 3*b + 4*c + 2*d == 40)
printf("Solution: a=%d b=%d c=%d d=%d\n", a, b, c, d);
return 0;
}
输出:
Solution: a=0 b=0 c=0 d=20
Solution: a=0 b=0 c=1 d=18
Solution: a=0 b=0 c=2 d=16
Solution: a=0 b=0 c=3 d=14
Solution: a=0 b=0 c=4 d=12
Solution: a=0 b=0 c=5 d=10
Solution: a=0 b=0 c=6 d=8
Solution: a=0 b=0 c=7 d=6
Solution: a=0 b=0 c=8 d=4
Solution: a=0 b=0 c=9 d=2
Solution: a=0 b=0 c=10 d=0
Solution: a=0 b=2 c=0 d=17
Solution: a=0 b=2 c=1 d=15
Solution: a=0 b=2 c=2 d=13
. . .
<many more solutions>
. . .
答案 3 :(得分:-1)
如果您想得到1的答案,则方程式将3乘以y = 3除以3 = 1和y = 1,因此答案是3乘以bt 1 = 3