【剑指offer】题43:n个骰子的点数

来源:互联网 发布:淘宝标题促销词 编辑:程序博客网 时间:2024/06/01 07:34

动态规划
使用dp[k][i]表示k个骰子时,点数和为i的组合数
则转移状态方程:

dp[k][i]=j=16dp[k1][ij]


void func(int n){    if (n < 1)    {        return;    }    vector<int> vec(n*6+1);    vector<vector<int>> dp(n+1,vec);    for (auto i = 1; i <= 6;i++)    {        dp[1][i] = 1;    }    for (auto k = 1; k < n; ++k)    {        for (auto i = k; i < 6*k+1; ++i)        {            for (auto j = 1; j <= 6; j++)            {                dp[k + 1][i + j] += dp[k][i];            }        }    }    int sum = accumulate(dp[n].begin(), dp[n].end(),0);    for (auto i = 0; i < 6 * n + 1;++i)    {        if (dp[n][i]!=0)        {            cout << i << " " << (double)dp[n][i] / (double)sum<<endl;        }    }}

原创粉丝点击