質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

1回答

995閲覧

全探索を避ける方法(金利計算)

yoshikazu.egawa

総合スコア3

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

0グッド

1クリップ

投稿2021/10/28 00:08

Pythonの初学者です。(Python3.7を使っています)
全探索すれば答えが出せる問題ですが、すぐに計算時間が発散してしまいます。これを避ける方法について教えてください。

最初にM(整数)というお金を持っているとします。P(整数値)%という金利が与えられますが、Pをばらばらにして複利にして使うことができます。
ただし、金利は一度計算した時点で、小数点以下は切り捨てられます。
例として、M=1000, P=3%のとき、以下の4通りのうち、最大値を求めたいです。
① int(int(int(M*(100+P)/100)・(100+P)/100))・(100+P)/100))
② int(int(M*(100+P)/100))・(100+2P)/100))
③ int(int(M*(100+2P)/100))・(100+P)/100))
④ int(M*(100+3P)/100))

可能なすべての組み合わせを求めて、それらの最大値を計算すればよいのですが、P=20くらいで計算時間が1秒を超えてあとは発散してしまいます。できれば、P=100%まで計算できるようにしたいです。

P=20の場合の全探索の一部を書き出してみると、最大値を与える組み合わせはかなり多く規則性は見えませんが、少ない数(1~10)の組み合わせで最大値を実現している組み合わせが見られます。それで、一つの可能性として、Pを10個の単位に分割してして、10個単位で最大値を与える組み合わせをつないでいくというアルゴリズムでトライしましたが、全探索の結果と比較するとうまくいきません。(10個がよいのか11個がよいのか、いろいろトライしましたが)

どのようなアルゴリズムで考えればよいか教えていただければ幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/10/28 00:33

Mはどれくらいの大きさなのですか? (大きさによっては簡略化できることが考えられます)
yoshikazu.egawa

2021/10/28 00:46

Mは、1円から100万円くらいまでのイメージです。 よろしくお願いします。
kairi003

2021/10/28 02:19

些細なことですが、切り捨て除算子 // を使うと整数型を保ったまま切り捨てで除算ができます。 毎回int呼び出すのは見づらいでしょう。
guest

回答1

0

ベストアンサー

1%ずつ進める動的計画法を取ってはどうでしょうか。

  • 1%だけのとき…1通りしかない
  • 2%のとき…スタートから2%使ったときと、1%+1%としたときの大きな方
  • 3%のとき…スタートから2%使ったとき、1%+2%のとき、2%での結果+1%の3つを比較しての最大値

このように進めていけば、O(P**2)で片付きます。

投稿2021/10/28 01:54

maisumakun

総合スコア145208

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yoshikazu.egawa

2021/10/28 02:58

1%だけのとき…1通りしかない 2%のとき…スタートから2%使ったときと、1%+1%としたときの大きな方 3%のとき…スタートから<3>%使ったとき、1%+2%のとき、2%での結果+1%の3つを比較しての最大値 4%のとき…スタートから4%使ったとき、1%+3%のとき、3%での結果+1%の3つを比較しての最大値 という理解でよろしいでしょうか?(不勉強ですみません)
maisumakun

2021/10/28 03:16

4%のときは、2%での結果+2%のときも必要です。
yoshikazu.egawa

2021/10/28 06:35

ありがとうございました。実装して非常に高速であることが確認できました。動的計画法については、少し時間をかけて勉強します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問