『アリさんの小さなナップザック』


アリさんは5つの小さなナップザックをもって出かけます。
これら5個を区別することはできません。

一つのナップザックには最大3個のナップザックを入れます。
ただし、入れるナップザックの中にあるナップザックの数は含みません。

アリさんは1つのナップザックしか背負えません。

【問題1】

アリさんが出かけるとき、5個の小さなナップザックのパッキングの方法は何通りあるでしょうか。

【問題2】

アリさんのN個の小さなナップザックのパッキングの方法の数を計算します。

N個のパッキングの数を Pac(N)とし、これを係数とする整数係数多項式Anを次のように定義します。

Pac(0)=1 Pac(1)=1 Pac(2)=1
Pac(3)=2 Pac(4)=4 Pac(5)=問題1・・・・

n(t)=n
Σ
i=0
Pac(i)ti

このとき、下記の形式で多項式空間(環)におけるAnの漸化式を見つけてください。

n(t)=1+G(t,An-1) mod ti+1

注1)G(t,A)は汎関数であって、例えばt{A(t)2+A(t2)}のようなものです。

注2)mod ti+1は「tのi+1乗以上の項を無視する」程度の意味です。

【問題2 ヒント】

アリさんの背負っているナップザックの中の状態はつぎの3ケースの和で、
N−1以下の場合の数から漸化的に計算されます。

  1. 全部でN−1個入っているナップザック1個
  2. 合計でN−1個入っているナップザック2個
  3. 3つ合計でN−1個入っているナップザック3個

【問題3】

問題2の式をベースにPac(N)を計算するアルゴリズムを考え、その計算量をNの式でおよそ表してください。
およそとは±1の誤差とし、その代り、Nで場合分けしない1つの式としてください。
計算量は下記条件で求めるものとします。

  1. 計算はPac(0)=1が分かっているところから始めます。

  2. 計算は剰余切り捨ての整数四則演算だけで行います。
    K乗はK−1回の掛け算です。

  3. 計算量は乗算と除算の全回数とします。

  4. 定数×Aを A+A+...Aに置き換えるのは禁手とします。

  5. if for switch などフロー制御そのものの計算量は無視します。

【問題4】

17個の小さなナップザックの場合の数 Pac(17) を計算してください。

【おまけ1】

問題3の答えはNの2次式のオーダーで得られたと思いますが、
(1)〜(5)の定義のアバウトな点をつくと、ここで言う「計算量」がNの一次式のオーダーとなる方法があります。
それはどんな方法でしょうか。
(実際のプログラムでの計算量はNの2次式以上になってしまいます。)

【おまけ2】

本当の意味で計算量がNの一次式程度のアルゴリズム(問題2にこだわらない)はあるでしょうか。???
(cf. 『5つのナップザック』の問題では存在し、計算量はN−2 )

【うんちく】

アリさんをカルボキシル基(COOH)に、小さなナップザックを炭素(C)に置き換え、空いているところを水素(H)で埋めると、飽和脂肪酸の分子構造式になります。

つまり、Pac(N)は炭素数がN+1の飽和脂肪酸の族での構造異性体の数になります。

問題1に対応する物質は俗称でカプロン酸(C5H11COOH)、
問題4に対応してはステアリン酸(C17H35COOH)と呼ばれています。

因みに、N=1に対応するのは酢酸(=酢)(CH3COOH)であり、
N=0に対応するのは 蟻(ギ)酸(HCOOH) です。


解答用紙はこちらです。 【寄せられた解答】


 ◆個数を数える問題へもどる

 数学の部屋へもどる