高分!!!!! 求算法。。。。。

Lcindep110 2010-12-05 10:41:45
求以下公式中的 X, X1, X2; Y, Y1, Y2 的值

X * Y = Z
X1 * Y1 = Z1
X2 * Y2 = Z2

SUM = (Z + Z1 + Z2) * 0.86

Y * 42 = W
Y1 * 42 = W1
Y2 * 42 = W2

最后
W - SUM = 正数(A)
W1 - SUM = 正数(B)
W2 - SUM = 负数(C)

这里A必须是取最大的,B取正数(不限大小), C要去最小的

这里附上个例子
假设:
18 * 100 = 1800
15 * 80 = 1200
12 * 60 = 720

SUM = (1800+1200+720) * 0.86 = 3199.2

100 * 42 = 4200
80 * 42 = 3360
60 * 42 = 2520

4200 - 3199.2 = 1000.8
3360 - 3199.2 = 160.8
2520 - 3199.2 = -679.2

像这个得出的是 A = 1000.8, B = 160.8, C = -679.2
那么得出的结果就是 A 不是最大的, C 也不是最小的。

我要的是
A的值是正数且越大越好,B只要求是正数即可,C能是正数更好,负数离正数越近越好。



看看那位仁兄可以帮在下解决下。。。。给个最佳的公式。。。 第一个满意的答案 给200分

有人能解答,且答案满意,200分可再追加额外分数。

...全文
176 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
koukoujiayi 2010-12-06
  • 打赏
  • 举报
回复
做了一下,穷举法!
由于三个y不固定,我都取1--100,楼主可自行赋值,
数据较大的话运行时间巨大,我取100也运行了一段时间!
代码如下:(在Button的Click下运行)
    protected void Button1_Click(object sender, EventArgs e)
{
//X, X1, X2 总和 = 45 或者 44 可以 随即组合
//Y, Y1, Y2 随便正数
//这里A必须是取最大的,B取正数(不限大小), C要去最小的

for (int xx = 1; xx <= 45; xx++)
{
for (int xx1 = 1; xx1 <= 45; xx1++)
{
for (int xx2 = 1; xx2 <= 45; xx2++)
{
if (xx + xx1 + xx2 == 45)
{
setTow(xx, xx1, xx2);
}
}
}
}
Response.Write("X=" + temp[0].ToString() + "<br />");
Response.Write("X1=" + temp[1].ToString() + "<br />");
Response.Write("X2=" + temp[2].ToString() + "<br />");
Response.Write("Y=" + temp[3].ToString() + "<br />");
Response.Write("Y1=" + temp[4].ToString() + "<br />");
Response.Write("Y2=" + temp[5].ToString() + "<br />");
Response.Write("A=" + tempa.ToString() + "<br />");
Response.Write("B=" + tempb.ToString() + "<br />");
Response.Write("C=" + tempc.ToString() + "<br />");

}


double? tempa = null, tempb = null, tempc = null;
int[] temp=new int[6];
//函数
private void setTow(int x, int x1, int x2)
{
int loopValue = 100;//这是你可自行赋值
int z, z1, z2,w,w1,w2;
double a,b,c,sum;

for (int y = 1; y <= loopValue; y++)
{
for (int y1 = 1; y1 <= loopValue; y1++)
{
for (int y2 = 1; y2 <= loopValue; y2++)
{
z = x * y;
z1 = x1 * y1;
z2 = x2 * y2;

sum = Convert.ToDouble(z + z1 + z2) * 0.86;

w = y * 42;
w1 = y1 * 42;
w2 = y2 * 42;

a = Convert.ToDouble(w) - sum;
b = Convert.ToDouble(w1) - sum;
c = Convert.ToDouble(w2) - sum;

if (tempa == null)
{
tempa = a;
tempb = b;
tempc = c;
}
else
{
if (b > 0)//B取正数
{
if (a > tempa && c < tempc)//a取最大同时C要最小

{
tempa = a;
tempb = b;
tempc = c;

temp[0] = x;
temp[1] = x1;
temp[2] = x2;
temp[3] = y;
temp[4] = y1;
temp[5] = y2;

}
}
}
}
}
}
}

最终结果:
(条件是三个y是1--100)
X=1
X1=1
X2=43
Y=100
Y1=3
Y2=1
A=4074.44
B=0.439999999999998
C=-83.56
Lcindep110 2010-12-06
  • 打赏
  • 举报
回复
好的,谢谢你了。
koukoujiayi 2010-12-06
  • 打赏
  • 举报
回复
条件知道了,有空试试看!
Lcindep110 2010-12-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lcindep110 的回复:]
引用 9 楼 koukoujiayi 的回复:
X, X1, X2; Y, Y1, Y2 的值范围??


X, X1, X2 总和 = 45 或者 44 可以 随即组合

Y, Y1, Y2 随便数字
[/Quote]

Y, Y1, Y2 随便正数
Lcindep110 2010-12-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 koukoujiayi 的回复:]
X, X1, X2; Y, Y1, Y2 的值范围??
[/Quote]

X, X1, X2 总和 = 45 或者 44 可以 随即组合

Y, Y1, Y2 随便数字
koukoujiayi 2010-12-06
  • 打赏
  • 举报
回复
X, X1, X2; Y, Y1, Y2 的值范围??
Lcindep110 2010-12-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lcindep110 的回复:]
引用 6 楼 pittroll 的回复:
这个需求的话不太好搞。


那是否有解决的办法呢?
[/Quote]

是否可以用种算法,在N种集合中取最佳的结果呢?
那我现在要的只是 最佳的 X, X1, X2; Y, Y1, Y2 这几个的值
Lcindep110 2010-12-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 pittroll 的回复:]
这个需求的话不太好搞。
[/Quote]

那是否有解决的办法呢?
koukoujiayi 2010-12-06
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 lcindep110 的回复:]
虽然答案都不太理想,但是还是谢谢了。
[/Quote]
已经是穷举了,答案还有问题??
或我给你的程序逻辑有问题?
很想听听说法!
Lcindep110 2010-12-06
  • 打赏
  • 举报
回复
虽然答案都不太理想,但是还是谢谢了。
jshi123 2010-12-06
  • 打赏
  • 举报
回复
好像是个无厘头问题,Y越大越好啊,还是我没搞懂问题?呵呵

A=42y-0.86xy-0.86x1y1-0.86x2y2
A和y成正比,y越大,A越大

对于任意大的y,有:
B=42y1-0.86xy-0.86x1y1-0.86x2y2
只要 y1>(0.86xy+0.86x2y2)/(42-0.86x1) 即可满足B>0

由于C=42y2-0.86xy-0.86x1y1-0.86x2y2
所以当 y2=(0.86xy+0.86x1y1)/(42-0.86x2)时,C=0,即此时C为最小非负数

因为二元一次方程总是有解,所以第2,第3个条件总是可以满足的,也就是说,
y随便取,越大越好

比如:取y值为1w,x=18,x1=15,x2=12,解方程:
y1=(0.86xy+0.86x2y2)/(42-0.86x1)=(0.86*18*1w+0.86*12*y2)/(42-0.86*15)
y2=(0.86xy+0.86x1y1)/(42-0.86x2)=(0.86*18*1w+0.86*15*y1)/(42-0.86*12)
得到:
y1=y2=8243
此时:
A=73797.54,B=C=3.54

PitTroll 2010-12-05
  • 打赏
  • 举报
回复
这个需求的话不太好搞。
Lcindep110 2010-12-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 koukoujiayi 的回复:]
像这个得出的是 A = 1000.8, B = 160.8, C = -679.2
那么得出的结果就是 A 不是最大的, C 也不是最小的。
============================================
A和什么比较不是最大的?
c又和什么比较不是最小的?
[/Quote]

我语言表达能力欠佳,希望体谅一下。

我的意思是想说,照我上面举例的算法,A=1000,C=-679.2,如果和其他算法相比,
也许A还可以更大,而C的负数值可以更小更接近0,甚至为正数。

你现在明白我的意思了吗
koukoujiayi 2010-12-05
  • 打赏
  • 举报
回复
像这个得出的是 A = 1000.8, B = 160.8, C = -679.2
那么得出的结果就是 A 不是最大的, C 也不是最小的。
============================================
A和什么比较不是最大的?
c又和什么比较不是最小的?
hoken2020856 2010-12-05
  • 打赏
  • 举报
回复
有点意思,让我想起了Prolog
Lcindep110 2010-12-05
  • 打赏
  • 举报
回复
不要沉哦。。。。

110,556

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧