分割数の和

 投稿者:山中和義  投稿日:2014年 9月14日(日)07時00分11秒
  問題
正の整数が書かれたカードが何枚かあり、全てのカードの和は15であるとする。
1以上15以下の任意の整数kに対し、書かれた数の和がkになるように何枚かを選び出すことができという。
またその選び方は、同じ数の書かれたカードを区別しないものとするとただ1通りである。
このようなカードの組合せはどのようなものが可能か、全ての組合せを探して下さい。

 5の場合、
  1,1,1,1,1
  1,1,1,2
  1,1,3
  1,2,2
 の4通り


考察
1が少なくとも1つある分割数を考えればよい。

自明なもの
 1,1,1,…,1
 └ n個  ┘

 1,1,1,…,1, k  ただし、1≦k≦[(n+1)/2]
 └ n-k個 ┘

 n=2^k-1
 1,2,4,8,…,2^(k-1)

 n=Σk
 1,2,3,4,…,k
(終り)



LET N=15 !枚数の最大
DIM A(N) !数字の並び
LET A(1)=1 !番兵
PUBLIC NUMERIC C !場合の数
LET C=0
CALL try(2,N-1,A,N)
PRINT C; "通り"

PRINT T(N,N); "通り"
END

EXTERNAL SUB try(P,M,A(),N) !バックトラック法で検索する
FOR i=A(P-1) TO M !nを昇順の並びで分割する
   LET A(P)=i

   IF M-i=0 THEN !分割が終わったなら
      DIM B(N) !1からnまでの数 ※フラグ
      MAT B=ZER
      LET B(A(1))=1 !組み合わせ(動的計画法) 1つ目
      LET T=A(1) !※最大値
      FOR J=2 TO P !1つずつ選ぶ(2つ目以降)
         LET W=A(J)
         FOR K=T TO 1 STEP -1 !その数との和
            IF B(K)=1 THEN LET B(K+W)=1
         NEXT K
         LET B(W)=1 !その数のみ
         LET T=T+W
      NEXT J
      FOR K=1 TO N !1からnまでの数字がつくれたか
         IF B(K)=0 THEN EXIT FOR
      NEXT K
      IF K>N THEN !可能なら
         LET C=C+1 !結果を表示する
         FOR J=1 TO P
            PRINT A(J);
         NEXT J
         PRINT
      END IF
   ELSE
      CALL try(P+1,M-i,A,N) !次へ
   END IF
NEXT i
END SUB

EXTERNAL FUNCTION T(n,k) !漸化式
IF k<=1 THEN
   LET T=1
ELSE
   IF n<2*k-1 THEN
      LET T=T(n,INT((n+1)/2))
   ELSE
      LET T=T(n,k-1)+T(n-k,k)
   END IF
END IF
END FUNCTION

 

Re: 分割数の和

 投稿者:GAI  投稿日:2014年 9月14日(日)10時33分44秒
  > No.3498[元記事へ]

山中和義さんへのお返事です。

> 問題
> 正の整数が書かれたカードが何枚かあり、全てのカードの和は15であるとする。
> 1以上15以下の任意の整数kに対し、書かれた数の和がkになるように何枚かを選び出すことができという。
> またその選び方は、同じ数の書かれたカードを区別しないものとするとただ1通りである。
> このようなカードの組合せはどのようなものが可能か、全ての組合せを探して下さい。
> 例
>  5の場合、
>   1,1,1,1,1
>   1,1,1,2
>   1,1,3
>   1,2,2
>  の4通り
>

これだと、その選び方は、同じ数の書かれたカードを区別しないものとするとただ1通りである。
の条件に反し
1,1,1,2
で2を構成する方法が 1+1,2
の2通り存在することになる。
よって答えは 3通りになります。
 

Re: 分割数の和

 投稿者:山中和義  投稿日:2014年 9月14日(日)15時14分30秒
  > No.3498[元記事へ]

発展問題
正の整数が書かれたカードが何枚かあり、全てのカードの和は15であるとする。
1以上15以下の任意の整数kに対し、書かれた数の和がkになるように何枚かを選び出すことができるという。
またその選び方は、同じ数の書かれたカードを区別しないものとするとただ1通りである。
このようなカードの組合せはどのようなものが可能か、全ての組合せを探して下さい。

 5の場合、
  1,1,1,1,1
  1,1,3
  1,2,2
 の3通り

 2,1+1や1+1+1,1+2なので、1,1,1,2を除く。


考察


!1種類の数の場合
!1,1,1,…,1
!└ a個 ┘
!題意より、a=n

LET N=15
PRINT "1が";STR$(N);"個"

PRINT


!2種類の数の場合
!1がa個あるので、1からaまでの数はこれで表せるので、2番目の数はa+1である。
!1,1,…,1,  a+1,a+1,…,a+1
!└ a個 ┘  └   b個   ┘
!題意より、a+(a+1)b=n ∴(a+1)(b+1)=n+1
!不定方程式を解く。

LET M=N+1
FOR A=2 TO M-1
   IF MOD(M,A)=0 THEN !n+1の約数なら(1とn+1は除く)
      LET B=M/A
      PRINT "1が";STR$(A-1);"個、"; STR$(A);"が";STR$(B-1);"個"
   END IF
NEXT A

PRINT


!3種類の数の場合
!1,1,…,1,  a+1,a+1,…,a+1,  (a+1)(b+1),(a+1)(b+1),…,(a+1)(b+1)=a+(a+1)b+1
!└ a個 ┘   └   b個   ┘    └           c個          ┘
!題意より、a+(a+1)b+(a+1)(b+1)c=n ∴(a+1)(b+1)(c+1)=n+1
!不定方程式を解く。

LET M=N+1
FOR A=2 TO M-1
   IF MOD(M,A)=0 THEN !n+1の約数なら
      FOR B=2 TO M/A-1
         IF MOD(M/A,B)=0 THEN !(n+1)/aの約数なら
            LET C=(M/A)/B
            PRINT "1が";STR$(A-1);"個、";
            PRINT STR$(A);"が";STR$(B-1);"個、";
            PRINT STR$(A*B);"が";STR$(C-1);"個"
         END IF
      NEXT B
   END IF
NEXT A

PRINT


!4種類の数の場合
!1,…,1,  a+1,…,a+1,  (a+1)(b+1),…,(a+1)(b+1),  (a+b)(b+1)(c+1),…,(a+b)(b+1)(c+1)=a+(a+1)b+{a+(a+1)b+1}c+1
!└a個┘  └ b個 ┘    └      c個      ┘           └           d個          ┘
!題意より、a +(a+1)b +(a+1)(b+1)c +(a+1)(b+1)(c+1)d = n ∴(a+1)(b+1)(c+1)(d+1)=n+1
!不定方程式を解く。

LET M=N+1
FOR A=2 TO M-1
   IF MOD(M,A)=0 THEN !n+1の約数なら
      LET M1=M/A
      FOR B=2 TO M1-1
         IF MOD(M1,B)=0 THEN !(n+1)/aの約数なら
            LET M2=M1/B
            FOR C=2 TO M2-1
               IF MOD(M2,C)=0 THEN !(n+1)/(ab)の約数なら
                  LET D=M2/C
                  PRINT "1が";STR$(A-1);"個、";
                  PRINT STR$(A);"が";STR$(B-1);"個、";
                  PRINT STR$(A*B);"が";STR$(C-1);"個、";
                  PRINT STR$(A*B*C);"が";STR$(D-1);"個"
               END IF
            NEXT C
         END IF
      NEXT B
   END IF
NEXT A

PRINT


!5種類の数の場合
!  :
!  :

END


実行結果

1が15個

1が1個、2が7個
1が3個、4が3個
1が7個、8が1個

1が1個、2が1個、4が3個
1が1個、2が3個、8が1個
1が3個、4が1個、8が1個

1が1個、2が1個、4が1個、8が1個

 

Re: 分割数の和

 投稿者:山中和義  投稿日:2014年 9月15日(月)10時57分49秒
  > No.3500[元記事へ]

> 発展問題
> 正の整数が書かれたカードが何枚かあり、全てのカードの和は15であるとする。
> 1以上15以下の任意の整数kに対し、書かれた数の和がkになるように何枚かを選び出すことができるという。
> またその選び方は、同じ数の書かれたカードを区別しないものとするとただ1通りである。
> このようなカードの組合せはどのようなものが可能か、全ての組合せを探して下さい。
> 例
>  5の場合、
>   1,1,1,1,1
>   1,1,3
>   1,2,2
>  の3通り
>
>  2,1+1や1+1+1,1+2なので、1,1,1,2を除く。


考察
1,…,1,  a+1,…,a+1,  (a+1)(b+1),…,(a+1)(b+1),  (a+1)(b+1)(c+1),…,(a+1)(b+1)(c+1),   …
└a個┘  └ b個 ┘    └      c個      ┘           └           d個          ┘
題意より、a +(a+1)b +(a+1)(b+1)c +(a+1)(b+1)(c+1)d + … = n ∴(a+1)(b+1)(c+1)(d+1) … = n+1
不定方程式を解く。

したがって、数の並びには、n+1の約数が現れる。


構造が見えてきたので、再帰呼出しでプログラムをまとめてみる。


LET N=15

DIM X(N) !個数
PUBLIC NUMERIC C !場合の数
CALL try(1,N+1,X)
PRINT C; "通り"
END

EXTERNAL SUB try(P,M,X()) !バックトラック法で検索する
LET X(P)=M !p種類揃ったなら

LET C=C+1 !結果を表示する
LET T=1
FOR i=1 TO P
   PRINT STR$(T);"が";STR$(X(i)-1);"個、";
   LET T=T*X(i)
NEXT i
PRINT


FOR A=2 TO M-1
   IF MOD(M,A)=0 THEN !約数なら
      LET X(P)=A
      CALL try(P+1,M/A,X) !次へ
   END IF
NEXT A
END SUB


実行結果

1が15個、
1が1個、2が7個、
1が1個、2が1個、4が3個、
1が1個、2が1個、4が1個、8が1個、
1が1個、2が3個、8が1個、
1が3個、4が3個、
1が3個、4が1個、8が1個、
1が7個、8が1個、
8 通り



n=2014のとき、n+1=2015=5×13×31

1が2014個、
1が4個、5が402個、
1が4個、5が12個、65が30個、
1が4個、5が30個、155が12個、
1が12個、13が154個、
1が12個、13が4個、65が30個、
1が12個、13が30個、403が4個、
1が30個、31が64個、
1が30個、31が4個、155が12個、
1が30個、31が12個、403が4個、
1が64個、65が30個、
1が154個、155が12個、
1が402個、403が4個、
13 通り


 

Re: 分割数の和

 投稿者:GAI  投稿日:2014年 9月16日(火)12時21分16秒
  > No.3501[元記事へ]

山中和義さんへのお返事です。

すっきりしたプログラムで記述できるんですね。


> n=2014のとき、n+1=2015=5×13×31
>
> 1が2014個、
> 1が4個、5が402個、
> 1が4個、5が12個、65が30個、
> 1が4個、5が30個、155が12個、
> 1が12個、13が154個、
> 1が12個、13が4個、65が30個、
> 1が12個、13が30個、403が4個、
> 1が30個、31が64個、
> 1が30個、31が4個、155が12個、
> 1が30個、31が12個、403が4個、
> 1が64個、65が30個、
> 1が154個、155が12個、
> 1が402個、403が4個、
>  13 通り


これを真似て
n=8639
で実行したら大変なことになりました。
(とても人間業では不可能です。)
なんと76864 通りでした。
(断トツの多さです。第2位 n=9215 の 45568 通り)
 

戻る