動的計画法の分割数について
下記、動的計画法を用いて分割数を求める問題についてです。
下記dp配列を定義し、漸化式を立て本問題を解くそうなのですが理解できていない点が三つあります。疑問点を上手く言語化できておりませんが解説いただけると幸いです。
わからない箇所
- 漸化式のdp[i][j-i]は予めi個を1個ずつi個の集合に割り当てて残ったj-i個をこの集合に割り当てるという考え方らしいのですがなぜそうするのか意図がわかりません。
直下例のように考えるそうなのですが、集合に一個ずつ割り当ててますがその下で6,0,0,0と0を割り当てていますがよろしいのでしょうか。
例)10個を4個に分けるパターンは、まず集合が4ついるので、それぞれの集合に1個ずつ割り当て
1, 1, 1, 1
あとは、残った6個をこの4つの集合に割り振るパターン数を考えればよい。
例えば、
6, 0, 0, 0
1, 1, 1, 3
2, 2, 0, 2動的計画法のイメージが全体的につかめておりません。
考え方
dp配列:dp[i][j]:=jのi分割の総和
漸化式:dp[i][j] = dp[i][j-i]+dp[i-1][j]
問題
n個のお互いに区別できない品物を、m個以下に分割する方法の総和を求めMで割ったあまりを答えなさい。
入力
n=4
m=3
M=10000出力
4(1++2=1+3=2+2=4)
参照:プログラミングコンテンストチャレンジブック