Chinaunix首页 | 论坛 | 博客
  • 博客访问: 646856
  • 博文数量: 110
  • 博客积分: 8090
  • 博客等级: 中将
  • 技术积分: 1217
  • 用 户 组: 普通用户
  • 注册时间: 2005-10-10 15:32
文章分类

全部博文(110)

文章存档

2017年(2)

2015年(1)

2014年(1)

2013年(1)

2012年(1)

2011年(1)

2008年(7)

2007年(27)

2006年(45)

2005年(24)

我的朋友

分类:

2007-05-23 16:24:56

假如有若干文件,要刻录到一张光盘,如何组织文件能尽可能减少光盘浪费的空间呢?
以下是php算法
$a=array(2798617,2885031,17853577,6826953,24701392,3299597,5763205,2720910,7311416);//假设有这些文件大小
$need=50000000;//假设光盘最大容量
natsort($a);$bs=array_keys($a);//取得自然序列成数组
sort($a);//文件大小排序
$min=min($a);
$sum=array_sum($a);
if($need>$sum || $need<$min) die();//如果全部的和小于光盘容量或者最小文件容量大于光盘容量就没必要继续了
$pre=-1;
$key='';
$all=count($a);
for($i=0;$i<$all-1;$i++) {
 $m=$a[$i];
 $k=$i;
 if($m>$need) break;
 $cha=$need-$m;
 if($pre>-1) {
  if($pre>$cha) {
   $pre=$cha;
   $key=$k;
  }
 }
 else $pre=$cha;
 for($j=$i+1;$j<$all;$j++) {
  $m+=$a[$j];
  $k.='+'.$j;
  if($m>$need) break;
  $cha=$need-$m;
  if($pre>$cha) {
   $pre=$cha;
   $key=$k;
  }
  for($x=$j+1;$x<$all;$x++) {
   $m+=$a[$x];
   if($m>$need) break;
   $cha=$need-$m;
   $k.='+'.$x;
   if($pre>$cha) {
    $pre=$cha;
    $key=$k;
   }
  }
 }
}
$tmp=explode('+',$key);
foreach($tmp as $v) {
 $bt[]=$bs[$v]+1;
}
sort($bt);//取得原始序列
echo '最佳组和:',join('+',$bt),' 浪费空间:',$pre;
?>

运行结果:
最佳组和:3+5+9 浪费空间:133615

就是说第3,5,9号文件组合起来刻录到光盘浪费的空白空间最少

阅读(2315) | 评论(0) | 转发(0) |
0

上一篇:

下一篇:今日故市小结

给主人留下些什么吧!~~