算法:
先从大到小排好,你给的数据是从小到大排的
46KB,55KB, 62KB,87KB,108KB,114KB,137KB,164KB,253KB,364KB,372KB,388KB,406KB,432KB,461KB,851KB
然后1.44MB=1.44x1024KB=1474KB
然后从16个数据中依次由大到小加下去,851+461=1312<1474
再用1474-1312=162,所以下一个是加137
1312+137=1449<1474
再用1474-1449=25,发现数据中没有比25小的
所以第一次结束
第一次851+461+137
接下来再处理剩下的13个数
46KB,55KB, 62KB,87KB,108KB,114KB,164KB,253KB,364KB,372KB,388KB,406KB,432KB
从13个数据中依次由大到小加下去,432+406=838<1474
1474-838=636,所以下一个加388
838+388=1226<1474
1474-1226=248,所以下一个加164
1226+164=1390<1474
1474-1390=84,所以下一个加62
1390+62=1452,
1474-1452=22,发现数据中没有比25小的
所以第二次结束
第二次432+406+388+164+62
接下来再处理剩下的8个数
46KB,55KB, 87KB,108KB,114KB,253KB,364KB,372KB
从8个数据中依次由大到小加下去,372+364=736<1474
1474-736=738,所以下一个加253
738+253=991<1474
1474-991=583,所以下一个加114
991+114=1105<1474
1474-1105=369,所以下一个加108
1105+108=1213<1474
1474-1213=261,所以下一个加87
1213+87=1300<1474
1474-1300=174,所以下一个加55
1300+55=1355<1474
1474-1355=119,所以下一个加46
1355+45=1400<1474
至此已经选完了
第三次选的结果是46+55+87+108+114+253+364+372
三次选完,所以需要三张
第一张: 1432KB
55KB,253KB,364KB,372KB,388KB
第二张: 1436KB
137KB,406KB,432KB,461KB
第三张: 1432KB
46KB,62KB,87KB,108KB,114KB,164KB,851KB。
用3个盘
46 62 406 55 87 432 108 114 164
461 253 372 388
364 851 137
46+55+...+851=4300
4300/1440 = 430/144 = 215/72 = 3 - 1/72.
所以,至少需要3张软盘。
1440 - (851+461) = 128 = 114 + 14, [851,461,114]...14
1440 - (432+406+388)= 214 = 164 + 46 + 4, [432,406,388,164,46]...4
1440 - (372+364+253+137+108+87+62+55)=2,[372,364,253,137,108,87,62,55]...2
这样,
第一张存大小分别为851,461,114(KB)的3个文件;
第二张存大小分别为432,406,388,164,46(KB)的5个文件;
其他文件存在第三张软盘上,可以满足要求。
所以,
上面这种存法使用的软盘数目最少。
51p[k
用Matlab程序做 里面的lingo做一下优化
可以先下载这样一个
程序