- - PR -
お手本になるようなソースコード
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-05-10 17:10
Ver.1ですが、VB.NET版。 #お題からはずれる余計な機能が付いてますが、お気になさらず #CIntのところは手抜きをしてます。
| ||||||||
|
投稿日時: 2007-05-10 17:33
なにげに、面白いテーマですよね。
どのように割り当てるのが最適か悩ましいですね。 {100,50,49,48,47,1} で、141 円を支払う場合は、 47円を3枚が一番いいですよね。 そのため、nagise さんの言うような、次のものが約数になっている場合や、 lalupin さんのような上下の金種のみで、決めていくような 最適化も難しいようです。 結局は、かなりの通り数を総当たりでやらないといけない気がします。 自分のやつは、実際の日本円と同じ金種でやって、64001 円だと、 そこそこのスピードで、できますが、63999円だと、とたんに 計算回数が増えて、52万回も再帰呼び出しがありました。 なんとか、ならんかなぁ | ||||||||
|
投稿日時: 2007-05-10 17:42
これは部分和問題の一種と考えることができそうですね。
ただし、該当する部分集合のうちで、最も要素数の少ないものを選ばなければいけない。 ぴったり払えない場合は、お釣りの枚数を最小化するとか付け加えるともっと難しくなりますね。 | ||||||||
|
投稿日時: 2007-05-10 17:56
えーと、3年ほど前にこんな議論がされていたようですよ、と。
http://ml.tietew.jp/cppll/cppll_novice/article/157 | ||||||||
|
投稿日時: 2007-05-10 18:22
私の言いたかったことというのは、約数となる金種がある場合、 約数側のみを使って払うというのは枚数が増えることが明らかなので 走査の枝狩りができるのではないかということです。 要するに、10000円を5000円x2とか1000円x10とかに置き換えるのは 明らかに枚数が増えるだけだから、 金種A = {10000, 5000, 1000, 500, 100, 50, 10, 5, 1} の中では大きいほうから優先して配すれば最適化されます。 これは大した時間をかけずに算出できますよね。 これと別に 金種B = {4096, 2048, 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 1} という系がある混合系を考えるとすると、 たとえば31415円を払う場合、 A系で31413円、B系で2円払う A系で31412円、B系で3円払う … A系で2円、B系で31413円払う の31415パターンを試すことでO(n)の時間で計算できないかなぁ、 というアイデアなのでした。 もちろん、金種が素数だったりするとこれっぽっちも最適化されません orz # どちらの計で何円払う、という判断の部分でも枝狩りは出来そうですけどね | ||||||||
|
投稿日時: 2007-05-10 18:49
どうしましょ。次のお題募ります?
| ||||||||
|
投稿日時: 2007-05-10 18:57
動的計画法で解いてみました。(言語はruby)
数万円程度ならなかなかのスピードで解けます。
参考:http://www.geocities.jp/m_hiroi/light/pyalgo23.html というかほとんど丸写し。 #編集 結果表示を変更とコマンドライン引数でコイン種別を取れるように変更。 さらに、実行例を追加。 [ メッセージ編集済み 編集者: sawat 編集日時 2007-05-11 00:39 ] | ||||||||
|
投稿日時: 2007-05-10 19:54
似たようなのに,最長共通部分列がありますよね。
別に最長でなくてもいいのですが、変動したテストログの最長共通部分から正規表現(もどき)を作成して、その後のテストログで異常が出力されてないかパターンチェックするようなことをやってみたんですが、1つのテストログファイルが数kbyteレベルを超えると、やはりメモリ不足になってパターン表現が作成できなかったので、いいアルゴリズムがあればちょっと大きなログが出力されるテストでもそのまま使えるなと思ってました。 私が作ったのは http://hp.vector.co.jp/authors/VA007799/viviProg/doc5.htm のアルゴリズムから1文字のみの一致は評価点を下げ、特異点での値だけを覚えるようにしてテーブル(リスト)を小さくしたもので、通常のデータだと2%くらいのサイズになりました。(オブジェクトをリストにしているので本当のメモリ節約はしてませんが) |