最少分组方案算法
一组两两不等的正整数,如何划分成最少的组数,使得每组里所有数之积均不大于给定的数值?
比如,
求将前 172 个素数的最少分组组数方案,
使得每组数之积均小于 2^32 ?
(显然最少分组组数极限值= |~ ln(1024#)/ln(2^32) ~| = 45,但估计很难达到,我现在可做到 47 )
其实,也可换个提法:
给定一个大整数N(已知其因数分解),及一个给定的正整数L,
请用最少数目的整数,使其乘积=N,且每个数均不大于L{ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019, 1021 };备注:
1、最佳方案可能不止一种,提供一个即可;
2、所用算法应具有良好的扩展性;
3、请提供源代码,并附原理介绍;
4、对最佳解答者将可获得本次的 100 分悬赏! 我写了一个用回溯法暴力搜索的程序,前天半夜 12 点半才调试好(几年没写程序了,手生了好多)。
然后运行解问题1:对 1024 以内的素数分组。我以为一觉起来就有结果,没想到运行了差不多两天了还没出结果。
刚才我试着解问题2,瞬间就得到了少一组的解。仔细对比一下 93 组与 92 组的结果,发现不同的地方只在最后几组:
93 组:
No. 91 : 113 107 103 101
No. 92 : 89 83 73 67 59
No. 93 : 41
92 组:
No. 91 : 113 107 103 83 41
No. 92 : 101 89 73 67 59
第 93 组只有一个孤零零的 41 ,腾挪的余地非常大,所以才让我的程序幸运地很快就找出来。一般情况下,只能老老实实面对组合爆炸产生的海量运算。
解第一个问题的程序已经运行了 1 天零 17 个钟头了,但还没计算出一个 46 组的解。我猜 47 组是最优结果了,希望放在放假的 3 天内能算出来。
程序写得很烂,各位帮忙看看有没有改进的地方。 大家在关注奥运赛况时,也请挤点时间来考虑这个问题(应该不难)。:D
奇怪,悬赏帖只有“快速回复”模式?!太不方便了!:L
不过一些 Discuz! 代码标签仍然还是可用滴:) 你还不如用普通方式
但使用转帐方式奖励
==========
呵呵
100后面加个0就好了 我想遗传算法是不是更好些? 设每个数字的对数的算术平均值作为选择参数
某个组数字变换成1则会减少分组数 确实,发普通主题帖,然后声明用转帐方式奖励更好。:D
就给定的数据来说,用常规的整型变量即可,没必要用浮点的对数。
遗传算法——我不清楚,怎么用?:Q: 不好解释
你自己查去吧 我估计你的题目没有45组的解 我觉得很难求最优解:lol