这种情况应该如何考虑??
有这么一道题:
现有大、中、小三种鱼。大鱼每条5元,中鱼每条3元,小鱼每5条1元。要使100元正好卖100条鱼,编程求大、中、小鱼数。
当然我要解决的并不是什么卖鱼的问题,实际是要解决化学配料的问题,不过他们有相同之处,所以请各位帮忙,谢了。
问题点数:20、回复次数:23Top
1 楼xiong1234(提问)回复于 2001-07-03 11:26:56 得分 0
我要的只是思路,或是说算法。不一定是在PB中实现。Top
2 楼lqh178()回复于 2001-07-03 11:29:57 得分 1
在初等数论中有关于不定方程的解法,具体我记不清了.你可找本<初等数论>看一下.Top
3 楼assdeng(山野村夫)回复于 2001-07-03 11:31:10 得分 1
根本就无解嘛,除非鱼可以切开来卖。呵呵
Top
4 楼lqh178()回复于 2001-07-03 11:37:22 得分 0
如果无解在 不定方程的解法中可以求出.Top
5 楼Hanson_bati_zhu(欺世盗名之徒)回复于 2001-07-03 11:43:01 得分 0
有没有解不知道
反正穷举应该能够搞定
呵呵
啊,谁在骂我?!
Top
6 楼adhere(无)回复于 2001-07-03 11:44:09 得分 1
可以办到的啊
思路:
假设大鱼数量为X,中鱼为Y,小鱼为Z,所以有
X+Y+Z=100 和
5X+3Y+0.2Z=100
然后你可以在C语言中的嵌套循环
for(x=1;x<=100;x++)
{
for (y=1;y<=100;y++)
{
for(z=1,z<=100,z++ )
{
把方程式写成语句并用“printf()”把X\Y\Z显示出来就行了啊
}
}
}
Top
7 楼xiong1234(提问)回复于 2001-07-03 11:48:24 得分 0
这种办法可真是要时间呀,不过谢了,总算有一点思路了Top
8 楼ping_ping(苹苹)回复于 2001-07-03 13:03:32 得分 0
:)我说着玩的,不一定对,呵呵。
根据已知条件列出方程式:
x,y,z代表大,中,小
5x+3y+0.2z = 100
x + y+ z = 100
作为三元一次方程组还缺少一个约束,
对计算机而言,简单假定x=0 -> 100/5 = 20,只要循环21次,即可求出所有解答。
Top
9 楼szjlq(如果问题继续存在,请与供应商联系)回复于 2001-07-03 13:13:23 得分 0
有两种结果:
大鱼 中鱼 小鱼
5 50 75
12 8 80Top
10 楼szjlq(如果问题继续存在,请与供应商联系)回复于 2001-07-03 13:13:57 得分 0
上面写错啦
大鱼 中鱼 小鱼
5 20 75
12 8 80 Top
11 楼zhuzhichao(竹之草)回复于 2001-07-03 13:23:35 得分 0
int x,y,z;
for (x = 0;x <= 100 / 5;x++)
{
for (y = 0;y <= 100 / 3;y++)
{
for (z = 0;z <= 100 / 0.2;z++)
{
if ((5 * x + 3 * y + 0.2 * z == 100) && (x + y+ z == 100))
System.out.println("\nx = \t"+x+"\ny = \t"+y+"\nz = \t"+z);
}
}
}Top
12 楼susu_0807(苏苏)回复于 2001-07-03 13:59:02 得分 1
首先声明:算法与开发工具没有关系!
然后是这个问题的解决办法:(计算机比较笨,编程解决的话,只能穷举法,下面是个例子)
int a,b,c//a 大鱼 b 中鱼 c 小鱼
for a = 1 to 20
for b = 1 to 34
for c = 1 to 100
/*如果满足条件输出结果*/
next
next
next
Top
13 楼ping_ping(苹苹)回复于 2001-07-03 14:10:52 得分 10
~~~唉
我的算法只要循环21次啊,怎么没人理会呢?
Top
14 楼zhuzhichao(竹之草)回复于 2001-07-03 14:17:48 得分 0
to ping_ping(苹苹):
不對吧,外循環是21次,那內循環呢?
不用窮舉法怎麼做?Top
15 楼ping_ping(苹苹)回复于 2001-07-03 14:24:01 得分 0
:)
我还在试验呢
假定 x已知,则
y = (400 - 24x) / 14
z = 100 - y - x
判断一下 y,z是否为整数以及是否满足基本条件就可以了啊?
Top
16 楼Dump(当铺)回复于 2001-07-03 14:31:32 得分 1
to ping_ping 我支持你
对x进行循环即可
5x+3y+0.2z = 100
x + y+ z = 100
=> y=(80-4.8x)/3.2
y为整数即为所求解.
Top
17 楼ping_ping(苹苹)回复于 2001-07-03 14:31:38 得分 0
:)
呵呵,成功了啊。
算法:
int x,y,z
double yy
//x,y,z代表大,中,小
// 25x+ 15y+z = 500
// x + y +z = 100
// 分解后,
// y = (400 - 24x) / 14
// z = 100 - y - x
for x = 0 to 20 step 1
yy = (400 - 24 * x ) /14
if len(string(yy)) > 4 or yy <=0 then continue
y = yy
z = int(100 - y - x)
messagebox('OK','x='+string(x) + '~r'+string(y) + '~ry='+string(z) + '~rz=' &
+string(5*x+3*y+0.2*z) +'~r'+string(x+y+z))
end for
答案是:
5,20,75
12,8,80
Top
18 楼zhuzhichao(竹之草)回复于 2001-07-03 14:34:54 得分 1
哇,苹版主果然厲害,小生佩服的緊呀.
int x,y,z;
for (x = 0;x <= 100 / 5;x++)
{
if (((400 - 24 * x) % 14) == 0 && ((400 - 24 * x) / 14) >= 0)
{
y = (400 - 24 * x) / 14;
z = 100 - y - x;
System.out.println("\nx = \t"+x+"\ny = \t"+y+"\nz = \t"+z);
}
}
這樣就可以成功了,確實只要循環21次. Top
19 楼ping_ping(苹苹)回复于 2001-07-03 14:34:58 得分 1
这个地方有漏洞,呵呵
if len(string(yy)) > 4 or yy < 0 then continue
y = yy
z = 100 - y - x
Top
20 楼ping_ping(苹苹)回复于 2001-07-03 14:43:02 得分 1
还有这个Messagebox,呵呵。。。
messagebox('OK','x='+string(x) + '~ry='+string(y) + '~rz='+string(z) + '~rMoney=' &
+string(5*x+3*y+0.2*z) +'~rx+y+z='+string(x+y+z))
Top
21 楼lqh178()回复于 2001-07-03 15:53:20 得分 1
如果需求变一下以上的解法都将难以实现.所以有时间还是去学习一下<初等数论>中关于不定方程式的解法为好.并且那种解法不但具有通用性,且运算次数几乎是最少的...Top
22 楼wangsw(呀呀)回复于 2001-07-03 16:52:28 得分 1
算法!真是无穷尽呀!
Top
23 楼xiong1234(提问)回复于 2001-07-04 10:40:18 得分 0
感谢大家对这个问题的关心,我感动得都要……了,哈。现在又是个问题,我该怎么给分呢?但我想大家不会分分计较的!再次感谢大家。Top




