以下を解決するための効率的なアルゴリズムのヒントが欲しいです: (わかりました、問題はそれではなく、簡単にするためにこれを作成しただけです)。
例: N 個の広告ボードのうち、 K個の連続するボードに会社のM個の広告があるはずです。また、広告は
、N=3、K=2、M=1 の場合に最小数の広告のみが使用されるように使用されます。答えは 010 です。
N=6、K=3、M=2 の場合、答えは 6 になります
。011011、011101、011110、101101、101110、110110。
私は、反復的かつ再帰的な方法ですべての組み合わせを(バイナリアプローチで)作成するアプローチを取りました。その後、フィルタリングしました。N が大きい場合はクラッシュします (予想どおり)。これらを解決する効率的な方法はありますか?
私は別のアプローチを取りましたが、うまくいきません.. :(
2 番目のアプローチ
if($n%$k == 0){
$perm = $m*($n/$k);
}else{
$perm = $m*ceil($n/$k);
}
Then I will do the nCr... and now I'm lost
最初のアプローチ
<?php
$n = $input1;$k = $input2;$l=$input3; $total = 0;
$flag = false;$arrays = array();$z=0;$min=$n;$x=0;
$total_permutations = pow(2,$n);
for($i=0;$i<$total_permutations;$i++){
$binary = base_convert($i, 10, 2);
$binary = str_pad($binary, $n,"0", STR_PAD_LEFT);
for($j=0;$j<=($n-$k);$j++){
$flag = false;$x=0;
for($m=0;$m<$k;$m++){
$x += intval($binary{$j+$m});
}
if($x<$l){
$flag = true;
break;
}
}
if(!$flag){
$arrays[$z]=str_split($binary);
$arrays[$z] = array_map('intval', $arrays[$z]);
$z++;
echo $binary."<br />";
}
unset($binary);
}
$min = min(array_map('array_sum',$arrays));
echo "------------<br />";
foreach($arrays as $val){
$sum = array_sum($val);
if($sum == $min){
echo implode("",$val);echo "<br>";
$total++;
}
}
return $total;
}
?>