谁能来帮我看看C++的算法

来源:百度知道 编辑:UC知道 时间:2024/06/04 06:09:21
问题描述
有用户给出一个大圆 和n个小圆的半径,然后 把这几个小圆不重叠的放进去,如果都能放进去,给出算法,如果放不进去,尽可能多的放,使放进去的小圆面积之和最大就象用 n个小圆裁减大圆的时候是大圆的边角料最少啊,可以最大程序的利用大圆的面积!,
算法描述(不严密)
1先输入大圆半径
2把小圆按半径从大到小排列
3把第一个圆放到大圆的最下面(附图)
4第二圆要与大圆和先放进去的小圆相切,这个可以通过二元二次方程解出两个圆心(附图),判断两个圆是否都合理(和别的圆不重叠),如都合理,选择一个好的放法(选的时候是是给每个位置打分,选择分高的),如只有一个合理,选择之,都不合理,结束,放第三个圆的时候,要分别求和大圆与其中一个小圆相切, 大圆与另个小圆相切,两个小圆相切,共求出六个圆心,判断是否合理 ,并选择最好的(附图),就象象棋程序一样,面前有好多步可以走,但是要选择一个最有利于自己的步走!而我们要选择这一步,就是最有利于放更多的小圆!然后依次放第4个,5个。。。。n个。直到都不判断都不合理,或者没有可放的圆。并在界面上显示小圆的排列情况
界面描述
请输入大圆半径
请输入小圆半径
例如大圆100
小圆1,2, 5 ,9,10,25,14,56,10,78
能具体写点出来吗?

问题比较困难,用贪婪法求解,先放最大的,然后次大的,如果放不下,增加大圆半径,类推。不保证有其他方法能放下而这方法放不下,也不保证得到最小的大圆。但求解快捷,最终解较优。