「もし先輩女子エンジニアが『アルゴリズム』を図解で教えてくれるとしたら」を解いてみた その2

「もし先輩女子エンジニアが『アルゴリズム』を図解で教えてくれるとしたら」を解いてみた
の続きです

動的計画法のコードをPHPで書いてみました
(Rubyのコードとロジックは同じです)


<?php
$M = trim(fgets(STDIN)); // 人員
$N = trim(fgets(STDIN)); // 会社数

$minCost = 0;
$num = array();
$cost = array();

for($i = 0; $i < $N; $i++) {
    fscanf(STDIN, '%d %d', $num[$i], $cost[$i]);
    $minCost += $cost[$i];
}

$dp[0] = 0;
for($n = 0; $n < $N; $n++) {
    foreach ($dp as $key => $value) {
        $totalNum = $key + $num[$n];
        $totalCost = $value + $cost[$n];
        if (isset($dp[$totalNum]) == false) {
            $dp[$totalNum] = $totalCost;
        } else {
            if ($dp[$totalNum] > $totalCost) {
                $dp[$totalNum] = $totalCost;
            }
        }
        if ($totalNum >= $M && $minCost > $totalCost) {
            $minCost = $totalCost;
        }
    }
}

//ksort($dp);
//var_dump($dp);
echo $minCost;

人数ごとの結果を残して、再利用しています(わかりにくい..)
一番低いコストの値だけを残しています
まだ無駄のあるコードで、改良の余地ありです

paizaでコードを提出すると採点してくれます
結果はこんな感じです
http://paiza.jp/poh/kirishima/result/fb88794dc2e25c011a242f318744ccc9

最速コードを目指したりするとまだ遊べるようです

UbuntuにAndroid端末をUSB接続で認識させる

Androidアプリ開発のため
Android端末をUSBでUbuntuマシンにつないで、デバッグできるようにします

Ubuntu12.04、Nexus5で試しました

Android端末でまず、開発者モードにします
設定画面、端末情報を開いて、ビルド番号を7回連続タップすると開発者モードになります

android-setting1_s

設定画面に開発者向けオプションが増えるので、タップします
android-setting2_s

右上開発者オプションをON、にしてUSBデバッグにチェックをつけます
android-setting3_s

Androidアプリの開発で使うときは
設定画面、セキュリティ
android-setting4_s

提供元不明のアプリにチェックをつけておきます
android-setting5_s

USBでAndroid端末とUbuntuパソコンをつなぎます
Ubuntuでつなげている端末のベンダーIDをチェックします
# lsusb
Bus 001 Device 004: ID 18d1:d002 Google Inc.

Nexus5の場合、「18d1」でした(違う端末だと、18d1の場所をみてください)

認識できるよう設定ファイルに書き込みます(なければ作ります)
# sudo vim /etc/udev/rules.d/51-android.rules
SUBSYSTEM==”usb”, ATTR{idVendor}==”18d1″, MODE=”0666″, GROUP=”plugdev”

アクセス権限を確認
# ls -al /etc/udev/rules.d/51-android.rules
-rw-r–r– 1 root root 71 9月 8 15:38 /etc/udev/rules.d/51-android.rules

読み取り権限がなければつけておきます
# sudo chmod a+r /etc/udev/rules.d/51-android.rules

これでUSBを差し直すと、認識します
Android端末側で、許可を求められるのでOKを押しましょう

「もし先輩女子エンジニアが『アルゴリズム』を図解で教えてくれるとしたら」を解いてみた

paizaの
もし先輩女子エンジニアが『アルゴリズム』を図解で教えてくれるとしたら
という解説が公開されました

アルゴリズムのプログラムをあまりやったことがなかったの考えてみました
解説記事の全文探索をphpで書くとこんな感じ


<?php
function calc($cost, $staff, $idx) {
    global $n, $m, $result, $company;
    if ($n <= $idx) {
        return;
    }   
    if ($m <= $staff + $company[$idx]['num']) {
        $result[] = $cost + $company[$idx]['cost'];
    } else {
        calc($company[$idx]['cost'], $company[$idx]['num'], $idx + 1); 
    }
    calc($cost, $staff, $idx + 1);
}

$m = trim(fgets(STDIN)); // 人員
$n = trim(fgets(STDIN)); // 会社数

$company = array();
for ($i=0; $i < $n; $i++) {
    $t = trim(fgets(STDIN));
    $t = str_replace(
        array("\r\n", "\r", "\n"), '', $t
    );      
    $e = explode(" ", $t);
    $company[$i]['num'] = $e[0];
    $company[$i]['cost'] = $e[1];
}

$result = array();
calc(0, 0, 0);
arsort($result);
echo (array_shift($result));

これだと、会社数が増えたときに組み合わせが多すぎて、テストが通らないみたいです
ビットを使えば再帰関数が不要になります(記事参照)が、同じく全文探索です

計算結果を再利用する動的計画法を使えば、組み合わせが会社数×人数の組み合わせとなるので処理数が減らせテストがすべてクリアできたようです
(解答例 http://paiza.jp/poh/code_index はpaizaに会員登録するとみれます)

UbuntuのJavaを入れ直してみた

Ubuntu12.04のJavaのバージョンが古かったので入れ直します

いったんJavaを消します
# sudo apt-get purge openjdk-\*
apt-get purge で設定ファイルも消えます

JDKをダウンロードします
http://www.oracle.com/technetwork/java/javase/downloads/index.html

今回はAndroid Studioが対応している7を選びました(8はまだ未対応)

# cd /usr/local
# sudo mkdir java
# sudo tar xzvf ~/Downloads/jdk-7u67-linux-i586.tar.gz

# sudo update-alternatives –install “/usr/bin/java” “java” “/usr/local/java/jdk1.7.0_67/jre/bin/java” 1
# sudo update-alternatives –install “/usr/bin/javac” “javac” “/usr/local/java/jdk1.7.0_67/bin/javac” 1
# sudo update-alternatives –install “/usr/bin/javaws” “javaws” “/usr/local/java/jdk1.7.0_67/jre/bin/javaws” 1
# sudo update-alternatives –set java /usr/local/java/jdk1.7.0_67/jre/bin/java
# sudo update-alternatives –set javac /usr/local/java/jdk1.7.0_67/bin/javac
# sudo update-alternatives –set javaws /usr/local/java/jdk1.7.0_67/jre/bin/javaws

# javac -version
javac 1.7.0_67

これでバージョン7みたいです

# javac -version
バイナリファイルを実行できません

ってなったら、OSのビット数があってるか確認を
32bitOSなのに64bit版をダウンロードしててはまりました….