トップページに戻る    次のC#のサンプルへ    前のC#のサンプルへ

Problem76 100の分割数の数を求める

問題

5は数の和として6通りに書くことができる:

4 + 1
3 + 2
3 + 1 + 1
2 + 2 + 1
2 + 1 + 1 + 1
1 + 1 + 1 + 1 + 1
2つ以上の正整数の和としての100の表し方は何通りか.


ソース

using System;

class Program
{
    static void Main()
    {
        Console.WriteLine("DerivePatternCnt({0})={1}", 5, DerivePatternCnt(5));
        Console.WriteLine("DerivePatternCnt({0})={1}", 100, DerivePatternCnt(100));
    }

    static long DerivePatternCnt(int pN)
    {
        //場合の数[使用した枚数]なDP表
        int UB = pN;
        int[] DPArr = new int[UB + 1];
        DPArr[0] = 1;

        for (int I = 1; I <= pN - 1; I++) {
            for (int J = 0; J <= UB; J++) {
                if (DPArr[J] == 0) continue;

                int NewInd = J + I;
                if (UB < NewInd) break;
                DPArr[NewInd] += DPArr[J];
            }
        }
        return DPArr[UB];
    }
}


実行結果

DerivePatternCnt(5)=6
DerivePatternCnt(100)=190569291


解説

動的計画法で解いてます。