• ベストアンサー

2万円以上でできるだけ小さい値の組み合わせを探す

ある店のレシートを2万円以上集めると特典があるという企画のためにレシートを家内が集計しています。一回の買い物は、数百円から数千円で50枚近くあると思います。家内は凝り性で、「合計が20048円かー。もっと2万円に近づけられる組み合わせは無いだろうか?」と考えています(本当の話です)。エクセルのセルにレシートごとの値は入れてあるのですが、「2万円以上でできるだけ小さい値の組み合わせを探す」にはどうすればいいのでしょうか?素人にもわかるようにお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.5

レシートが50枚あるとして、2の50という示唆があるようだが、違うのでは。組み合わせ数(Conbination)になるのでしょう。50枚より何枚取るか決まっていない(勿論50枚以下)訳ですし。(1)1枚で2万円を越えるものは 除外。単独で応募するより他無い。(2)最大枚数は、小さいもの順に並べたとして、最小分から足して累積して行き、例えば7枚では2万円を越えず8枚で2万円を越えるとすると、50枚から8枚を取る組みあらせ以下の回数以下のはずです。(3)最大(2万円超を除く)の方から足して行き、2まいでは2万円を越えず、3枚で2万円を越えるなら、50枚から3枚以上を取り出す組み合わせになるのでは。結局3枚取る+ 4枚取る+5枚取る+・・+8枚取る場合の数分を加算してその和を大小順に並べて2万円に近いものから組み合わせ採用する。(4)その時ある場合に採用されたレシートは、他の場合に使えないから、組み合わせで顔をだしても、脱落させていくようになるでしょう。 こういう問題は数学の分野に出すと、こういう思考に慣れた人から回答が得られて良いと思います。

betajini
質問者

お礼

これは素人にも理解できます。 素人的にはとてもわかりやすく、 簡潔な解説ありがとうございました。 すっきり! (絶賛) 数学に投稿した方がいいのですか。 皆様もお忙しいところ、 大変速い御回答ありがとうございました。

その他の回答 (4)

  • gator
  • ベストアンサー率33% (159/480)
回答No.4

私も同様な質問をしたことがあります。 非常に難しい問題のようで、頂いた解答を完全に理解することはできませんでした。 素人にもわかるような回答があると良いですね。 一応URLをご参考になさってください。 以上

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=259493
betajini
質問者

お礼

ありがとうございました。 URL見ました。 やはり難しいのかなー。

betajini
質問者

補足

ありがとうございました。 URL見ました。 やはり難しいのかなー。 (原因はわかりませんが、 お礼欄に入力できなくなってしまったので 補足欄に入力しています)

  • ARC
  • ベストアンサー率46% (643/1383)
回答No.3

ちょいツッコミです。 2の50乗って、 1125899906842624回もループをまわそうと思ったら、何年かかることやら(^^;。 この手のプログラミングは、将棋やチェスと同様、力ずくでは出来ません。 プログラミング的な解法は、恐らくアルゴリズム事典などを漁れば、載っているのではないでしょうか。 (あるいは、「良い」アルゴリズムがないことが証明されているかもしれません。) とりあえずは、並べ替えの組み合わせ方の生成順をうまく作っておいて、これまでの最良スコア(2万円以上で最低金額)を超えた段階で、それより大きくなる組み合わせをスキップする、といったアルゴリズムで、(50枚程度なら)、計算可能な数にまで減らせるのではないかと思います。 って、なんだか脇道にそれまくりですね(汗 失礼しました~

betajini
質問者

お礼

1125899906842624回計算させるのは コンピューターでも時間がかかるのですか。 すぐできるのかと思ってました。 勉強になりました。

  • takumi38
  • ベストアンサー率62% (5/8)
回答No.2

論点とずれてしまいますが、アドバイスさせていただきます。 条件は「2万円で一口」だと思いますので、合計金額を2万円で割って、最大何口応募できるかを計算します。割り算の余りは端数の合計になります。その端数をさらに最大応募可能口数で割ると、一口あたりの端数分が出ます。端数がそれ以下であれば最大口数の応募ができることになります。端数を0に近づけても最大応募口数は変わりませんので、こういったアプローチも有効かと思います。 ただ、知的好奇心を満たすために端数0を目指すのならば、邪道かもしれませんがプログラミングをしてみるのもいいかと思います。アルゴリズムとしては、 1.レシート金額を降順に並べる 2.レシートすべての組み合わせについて合計金額を求め、2万円ちょうどならそれを表示する(2の50乗とおりの組み合わせを力ずくで調べることになります。) 3.2万円ちょうどの組み合わせを最大にさせるように最適な組み合わせを選ぶ(50枚ほどなので人間にもできるでしょう) このくらいならJavaScriptでもできそうですので、もし興味があったら挑戦してみるのも面白いかもしれません。 No.1の方も書いているように、レシートの最小金額が数百円のオーダであるのなら、少なくない確率で端数が出ることになると思います。 長くなりまして申し訳ありません。ご参考にしていただければ幸いです。

betajini
質問者

お礼

最初のほうのアプローチは使えそうですね。 でも、今回余った分は次回に持ち越しできる (年間を通じてやっているイベントです)ので、 2万円に満たない分は次の集計時に利用したいのです。

回答No.1

回答でなくて申し訳ありませんが、どの道端数が出てしまうのではないでしょうか? また、もれなくではなく、抽選ならの話ですが、たとえば10万円の商品を買った人と、2万円の商品を買った人の場合、10万円の人が優先(あたりやすく)なるらしい・・・。←あくまでもうわさです。

betajini
質問者

お礼

当たりやすくなる説、面白いです。

関連するQ&A