0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Z3Py 例題 コイン問題(制約充足問題)

Last updated at Posted at 2021-07-24

問題

1円硬貨,5円硬貨,10円硬貨を合計で15枚,それぞれを1枚以上持っている.
金額の合計は90円である. それぞれの硬貨を何枚持っているか?

回答

example01_coin.py
from z3 import *

coin__1yen = Int("coin__1yen")
coin__5yen = Int("coin__5yen")
coin_10yen = Int("coin_10yen")

s = Solver()
s.add(coin__1yen >= 1)
s.add(coin__5yen >= 1)
s.add(coin_10yen >= 1)
s.add((coin__1yen + coin__5yen + coin_10yen) == 15)
s.add((coin__1yen + 5 * coin__5yen + 10 * coin_10yen) == 90)

print(s.check())
if s.check() == sat:
    print(s.model())

出力

sat
[coin__5yen = 3, coin_10yen = 7, coin__1yen = 5]

解説

【基本的な順序】
Int()等で変数を定義し、s=Solver()s.add()で条件・制約を定義する。
s.check()で解があるかを確認する。(たぶん、ここで演算をしている)
解がある場合、「sat」が返ってき、解がない場合は「unsat」が返ってくる。
「sat」が返ってきた場合、s.model()で条件を満たす解の1つが取得できる。
(一つしか出てこないため、条件を満たす解が見つかった時点で探索を終了すると思われる)

他の例題

Z3Py個人的ポータル

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?