• ベストアンサー

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

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

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答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

  • エクセルで複数の数値から近似値の和を出したい

    エクセルで複数の値から近似値を出したいのですが、方法はありますでしょうか? ○やりたいこと 複数枚のレシートがあり、合計1万円単位で交換できるサービスに なるべく無駄なく(1万円に近い金額で)交換したい。 ○現状 電卓を何度もたたき、悩みながら手動で組み合わせたり、不足分を 計算しながら会計しレジに持って行きレシートを作成している。 (ただし、対象の買い物は火曜日しかダメなので悩みながら・・・。) ○理想 セルにレシートの絶対値(金額)を書き込み、10枚のレシートで、どう組み合わせたら壱万円に一番近く、誤差がいくら、と表示できたら最高。 金額だけでも表示できれば一生懸命組み合わせを探すことでも対応できるので、 近似値を探してくれるだけでも・・・。  理屈で言えばぐるナイのゴチバトル店舗のメニュー価格を各セルに入力し、 設定金額になる組み合わせを見つけ出す、という作業をしたいのです。 エクセルでは無理でしょうか?ベクターにあるようなプログラムができれば 難しくないのかもしれませんがわたしにはできないので・・・。

  • エクセルで、セルの中の値が規定値以上の場合に自動で色を付ける方法

    こんにちは。 今仕事でエクセルを使って集計しているのですが、入力した値が、例えば50以上だった場合自動的に色がつくようにしたいのですが、どのようにすればよいでしょうか? また、例えばセルの値が、そのセルのすぐ上の値より大きかった場合や小さかった場合に、自動的に色をつけることはできますか? わかりにくい文章で申し訳ありません。 よろしくお願い致します。

  • 値の個数、値の合計の出し方と日付への色付け

    EXCELで質問が2つあるのですが、 セルB列に「○」がある場合、 セルC列の値の個数、値の合計を出すには どのようにすればよいでしょうか? IFを使うのかな?ということしかわからないです。。。 もう1つは 日付を入力した際にカレンダーの休日に当たる場合、 その文字に色(赤)をつけたいのですが、 それはどのようにすれば宜しいでしょうか。 条件書式では出来ませんでした。。。 EXCELはほとんど素人です。すみません。

  • エクセルで組み合わせの計算式を使いたい

    エクセルで以下のような計算式を(最適な組み合わせの抽出)をしたいのですが? 表の中にある様々な単価から2以上の合計が一定額となる組み合わせを抽出したい。 もっと具体的にいうと、私が作った買いたい本のリストの中から、2以上の組み合わせで1500円となる組み合わせをエクセルから抽出したいのです。 よろしくお願いします。

  • EXCELでセル内の「円」表示を消したいのですが・・

    銀行の取引状況をコピー&ペーストでエクセルに取り込んで、合計金額を出しています。金額には「円」がついているのでオートSUMでの集計ができません。このため、セルごとに「円」表示を消して集計しているのですが、手間がかかります。何かいい方法はないものでしょうか?

  • Excelマクロ:複数シート同座標セルの値を、連番で一覧に参照したい

    マクロは素人なのでご教授お願いします。 Excelブック一つにシートが20あったとします。 ○20シート全ての同座標セルに、ある商品の「合計」と「個数」の値がある ○「集計」シートが別にあり、「sheet1」から「sheet20」までを連番で一覧にしてある 該当のセルに「合計」と「個数」の値を参照させる <「集計」シート 結果例>    A      B       C  1 シート名  合計数   個数(表見出し) 2 sheet1    78      5 3 sheet2    90      17 4 sheet3    112     224 また、以前まったくの逆の条件で質問をしまして、良回答いただきました。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=715150 参考までにご覧になってみて下さい。 よろしくお願い致します。

  • Excelで「範囲内の一つ以上に値が入っている」

    200行×50列ほどの入力欄がある表で、「入力するセルの左にある特定のセルの値が同じである範囲のうち一つ以上に値が入っていたら1」とカウントしたいです。 A__DEF 1__○_○ 2__○○_ 3___○○ 3__○__ 4__○_○ 4__○○○ 4____○ 5___○_ 6__○○○ 例えば上のような状態の時、D列は「5」E列は「5」F列は「4」になってほしいです。 今は範囲を直接指定してSIGNとCOUNTIFで集計しているのですが、行数が多くなると数式も長くなり、見づらかったりセルの限界に達したりしてしまいます。 いい方法があれば教えてください。 前提条件に不足があるようなら補足で説明します

  • Excelでのデータ集計/関数の組み合わせ等

    Excelでのデータ集計/関数の組み合わせ等 いつも、お世話になっております データ集計用に配列数式や関数を駆使しているのですが 思った通りの集計が出来ません。 以下のような集計方法を教えて頂けますでしょうか。 日付-ID-数 2010/7/1-AAA-5000     -BBB-3000     -CCC-0 2010/7/2-AAA-6000     -BBB-3000     -CCC-4000 …… 2010/8/1-AAA-4000 …… 1月単位でID毎に数が1以上あるレコードの数と その合計を取得したいのです。 ex1:2010/7/1-2010/7/31 AAA 31件 100000 ex2:2010/7/1-2010/7/31 CCC 30件  80000(7/1が0なので件数は1件減る) {=SUM(IF(MONTH(!$A$1:!$A$500)=1,1,0))}のような式では 日付の無いセルも参照している為、(ID:BBBの前には日付がない) 空白セルが1月と見なされてよけいな数字が入ってしまいます。 (1900/1/0と見なされている) YEAR関数も併用してみようと思いましたが上手く行きませんでした。 以上、よろしくお願い致します。

  • 1以上の値を検索する方法を教えてください

    エクセル2003で下記のように値が入っています。 A1:5 B1:9 C1:7 D1:0 E1:0 F1のセルに「A1~E1を検索し一番右端の1以上の値を拾え(0は拾うな)」 という式を入れたいのですがどのようにすれば良いのでしょうか? (この場合はC1の7を拾いたい) どなたかご教授願います。

  • 合計値が同じ組み合わせ

    下記の様な事ってEXCELの関数を使って、出力は可能でしょうか? 可能でしたら是非とも教えてください。 例)B列の1行目から10行目にそれぞれ数字が入力されていて、そこから4つのセルを抜き出し、合計値が30となる組み合せ全てを抽出する。

専門家に質問してみよう