日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

n个骰子的点数

發(fā)布時(shí)間:2024/4/11 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 n个骰子的点数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

n個(gè)骰子的點(diǎn)數(shù)

文章目錄

  • n個(gè)骰子的點(diǎn)數(shù)
    • 一、題目描述
    • 二、分析
      • 方法一:基于遞歸,效率低
      • 代碼一:
      • 方法二:基于循環(huán),性能好
      • 代碼二:
      • 方法三:動(dòng)規(guī)
      • 代碼三:

一、題目描述

把n個(gè)骰子仍在地上,所有的骰子朝上的一面的點(diǎn)數(shù)之和為s,輸入n,打印出s所有可能的值出現(xiàn)的概率。

二、分析

  • 骰子一共有6個(gè)面,每個(gè)面都有一個(gè)點(diǎn)數(shù),對(duì)應(yīng)的是1-6的數(shù)字,所以 n個(gè)骰子的最小點(diǎn)數(shù)之和是n,最大點(diǎn)數(shù)之和是6n
  • 根據(jù)排列組合的知識(shí),n個(gè)骰子所有點(diǎn)數(shù)的排列一共有6^n
  • 這道題求和為s的所有可能的值出現(xiàn)的概率,所以我們需要先統(tǒng)計(jì)每個(gè)點(diǎn)數(shù)出現(xiàn)的次數(shù),然后把每個(gè)點(diǎn)數(shù)出現(xiàn)的次數(shù)再分別除以6^n次方,即可求每個(gè)點(diǎn)數(shù)出現(xiàn)的概率

方法一:基于遞歸,效率低

  • 現(xiàn)在我們考慮如何統(tǒng)計(jì)每一個(gè)點(diǎn)數(shù)出現(xiàn)的次數(shù)。
  • 想要求n個(gè)骰子的點(diǎn)數(shù)和,我們可以 把n個(gè)骰子分為兩堆,一堆只有一個(gè)骰子,另一堆有n - 1個(gè)骰子
  • 只有一個(gè)骰子的那一堆可能出現(xiàn)點(diǎn)數(shù)為1~6的點(diǎn)數(shù),我們就需要分別計(jì)算從1到6的每一種情況和另一堆剩下n - 1個(gè)骰子來(lái)計(jì)算點(diǎn)數(shù)和
  • 接下來(lái)還是 把n - 1個(gè)骰子分為兩堆,一堆只有一個(gè)骰子,另一堆有n - 2個(gè)骰子
  • 我們把上一輪單獨(dú)的骰子和這一輪單獨(dú)的骰子的點(diǎn)數(shù)相加,然后再和剩下的n - 2個(gè)骰子來(lái)計(jì)算點(diǎn)數(shù)和
  • 到這里,我們就發(fā)現(xiàn)這是一個(gè)遞歸的問題:由小問題逐漸求得大問題;那么base case 就是當(dāng)骰子個(gè)數(shù)為1的時(shí)候
  • 那么我們可以定義一個(gè)長(zhǎng)度為6n - n + 1(6n是所有骰子最大的和,- n是因?yàn)椴豢赡艹霈F(xiàn)比骰子個(gè)數(shù)n還小的總和,所以節(jié)省n個(gè)空間)的數(shù)組用來(lái)保存相應(yīng)總和點(diǎn)數(shù)的出現(xiàn)的次數(shù),和為s的點(diǎn)數(shù)出現(xiàn)的次數(shù)保存在數(shù)組的第s - n(從0號(hào)位置開始)個(gè)元素里

代碼一:

#include <iostream> #include <math.h> #include <vector> #include <algorithm> using namespace std;//為了可拓展性,把骰子的最大面值定義一個(gè)變量 int g_maxValue = 6;//original:代表骰子的總個(gè)數(shù) //index:代表當(dāng)前是那個(gè)骰子 //curSum:當(dāng)前總和 //pProbability:保存結(jié)果每個(gè)總和s出現(xiàn)的次數(shù) void Probability(int original,int index,int curSum,vector<int>& pProbability) {//等于0,就代表把n個(gè)骰子不斷的分為【1,n - 1】、【1,n - 2】直到【2,1】,//即只剩下一個(gè)骰子,直接++即可,代表這是和為curSum - original一種if(index == 0){//curSum為總和//original代表骰子的個(gè)數(shù),即把和為curSum的出現(xiàn)次數(shù)+1pProbability[curSum - original] += 1;return;}//枚舉一個(gè)骰子的面值情況,遞歸進(jìn)行for(int i = 1;i <= g_maxValue;i++)Probability(original,index - 1,curSum + i,pProbability); }//n代表骰子的個(gè)數(shù) void PrintProbability(int n) {if(n < 1)return;//最大的和int maxSum = n * g_maxValue;//保存結(jié)果vector<int> pProbability(n * 6 - n + 1,0);int curSum = 0;Probability(n,n,curSum,pProbability);//總的出現(xiàn)所有次數(shù)int total = pow((double)g_maxValue,n);for(int i = n;i <= maxSum;i++){double ratio = (double)pProbability[i - n] / total;cout<<i<<":"<<pProbability[i - n]<<" "<<ratio<<" "<<endl;} }int main() {int number;while(cin>>number){PrintProbability(number);} return 0; }

方法二:基于循環(huán),性能好

  • 換一種思路,我們用兩個(gè)數(shù)組來(lái)存儲(chǔ)骰子點(diǎn)數(shù)的每一個(gè)總數(shù)出現(xiàn)的次數(shù)
  • 在本次循環(huán)中,第一個(gè)數(shù)組的第n個(gè)數(shù)字表示骰子和為n出現(xiàn)的次數(shù)
  • 在下一次循化中,我們?cè)谏弦淮窝h(huán)的基礎(chǔ)上加一個(gè)新的骰子,此時(shí)和為n的出現(xiàn)的次數(shù)就因該等于和為n - 1,n - 2,n - 3,n - 4,n - 5,n - 6的次數(shù)總和
  • 所以我們把另一個(gè)數(shù)組的第n個(gè)數(shù)字設(shè)為前一個(gè)數(shù)組的第n - 1,n - 2,n - 3,n - 4,n - 5,n - 6之和。

代碼二:

#include <iostream> #include <math.h> using namespace std;int g_maxValue = 6; void PrintProbability(int n) {if(n < 1)return;//定義兩個(gè)數(shù)組int* pProbability[2];pProbability[0] = new int[g_maxValue * n + 1];pProbability[1] = new int[g_maxValue * n + 1];//初始化for(int i = 0;i <= g_maxValue * n;i++){pProbability[0][i]=0;pProbability[1][i]=0;}//用來(lái)控制兩個(gè)數(shù)組的交替使用int flag = 0;//第一個(gè)骰子只可能出現(xiàn)1,2,3,4,5,6的情況,所以在對(duì)應(yīng)的位置值為1for(int i = 1;i <= g_maxValue;i++)pProbability[flag][i] = 1;//從第二個(gè)骰子開始判斷for(int k = 2;k <= n;k++){for(int i = 0;i < k;i++)pProbability[1 - flag][i] = 0;for(int i = k;i <= g_maxValue * k;i++){pProbability[1 - flag][i] = 0;for(int j = 1;j <= i && j <= g_maxValue;j++)pProbability[1 - flag][i] += pProbability[flag][i - j];}//交換兩個(gè)數(shù)組flag=1 - flag;}int total = pow((double)g_maxValue,n);for(int i = 0;i <= g_maxValue * n;i++){double ratio=(double)pProbability[flag][i] / total;cout<<i<<":"<<pProbability[flag][i]<<" "<<ratio<<" "<<endl;}delete[] pProbability[0];delete[] pProbability[1]; }int main() {int n;while(cin>>n){PrintProbability(n);}return 0; }

方法三:動(dòng)規(guī)

上面兩種都是《劍指offer》里面的解法,都比較難懂,現(xiàn)在將一種動(dòng)規(guī)的簡(jiǎn)單些

  • 首先該問題具備DP的兩個(gè)特征:最優(yōu)子結(jié)構(gòu)性質(zhì)和子問題的重疊性。
  • 具體的表現(xiàn)在:(1)n個(gè)骰子的點(diǎn)數(shù)依賴于n-1個(gè)骰子的點(diǎn)數(shù),相當(dāng)于在n-1個(gè)骰子點(diǎn)數(shù)的基礎(chǔ)上再進(jìn)行投擲。(2)求父問題的同時(shí),需要多次利用子問題。
  • 由此定義狀態(tài)轉(zhuǎn)移方程為dp(𝑛,𝑘)表示𝑛個(gè)骰子點(diǎn)數(shù)和為𝑘時(shí)出現(xiàn)的次數(shù)
    dp(𝑛,𝑘)=dp(𝑛?1,𝑘?1)+dp(𝑛?1,𝑘?2)+dp(𝑛?1,𝑘?3)+dp(𝑛?1,𝑘?4)+dp(𝑛?1,𝑘?5)+dp(𝑛?1,𝑘?6)
  • base case:第一輪的dp(1),dp(2),dp(3),dp(4),dp(5),dp(6)均等于1.
    𝑓(1,1)=𝑓(1,2)=𝑓(1,3)=𝑓(1,4)=𝑓(1,5)=𝑓(1,6)=1

代碼三:

#include<iostream> #define MAX_NUM 100 using namespace std;void FindSum(int n) {if(n <= 0)return;int sum = 0;int arr[n + 1][6 * n + 1];memset(arr,0,sizeof(arr));for(int i = 1; i <= 6; i++)//初始狀態(tài):base casearr[1][i] = 1;for(int i = 2; i <= n; i++)//狀態(tài)轉(zhuǎn)移方程{for(int j = i; j <= 6 * i; j++)//注意j的范圍受i影響{arr[i][j] += (arr[i - 1][j - 1] + arr[i - 1][j - 2] + arr[i - 1][j - 3] + arr[i - 1][j - 4] + + arr[i - 1][j - 5] +arr[i - 1][j - 6]);}}//輸出結(jié)果for(int i = n; i <= 6 * n; i++){sum += arr[n][i];}for(int i = n; i <= 6 * n; i++){cout<<i<<":"<<arr[n][i]<<" "<<(arr[n][i] * 1.0 / sum)<<endl;} }int main() {int n;while(cin>>n){FindSum(n);}return 0; }

總結(jié)

以上是生活随笔為你收集整理的n个骰子的点数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 四虎在线免费视频 | 日本少妇一级 | 在线视频国产一区 | 黄色片aaa | 在线观看视频一区二区 | 亚洲免费观看在线 | 国产精品一区二区三区免费在线观看 | 国产91网址 | 91三级视频 | 青春草在线视频观看 | 九九九免费 | 精品三区视频 | 午夜影院免费在线观看 | 欧美3p在线观看 | 欧美性做爰猛烈叫床潮 | 神马久久久久 | 丰满人妻在公车被猛烈进入电影 | 好吊色这里只有精品 | aa丁香综合激情 | 一级片久久 | 肉视频在线观看 | 婷婷综合另类小说色区 | 国产精品久久久久久久久晋中 | 中文在线视频观看 | 亚洲激情视频小说 | 免费看的av网站 | 亚洲一区二区黄色 | 加勒比精品在线 | 99久久婷婷国产综合精品草原 | 中文字幕免费在线看线人动作大片 | 性做久久久久久免费观看欧美 | 亚洲人掀裙打屁股网站 | 欧美日韩极品 | 国产在线一区二区三区四区 | 久久美女免费视频 | 老司机精品视频网站 | 亚洲av无码一区二区三区dv | 波多野结衣人妻 | 日韩在线观看中文字幕 | 欧美久久综合网 | 蜜桃av网| 激情久久婷婷 | 综合久久精品 | 久久精品这里只有精品 | 在线免费观看一级片 | a视频在线播放 | 亚洲精品久久久中文字幕 | 亚洲激情婷婷 | 天堂在线观看 | 亚洲依依| 欧美精品在线视频 | 亚洲一二三四五 | 一个人看的www视频在线观看 | 一卡二卡三卡在线 | 一级黄色小视频 | 久久久久亚洲精品 | 少妇高潮av久久久久久 | 久久精品午夜 | 国产小视频免费观看 | 中文字幕人成人乱码亚洲电影 | 成年人视频免费 | 天天干天天爽天天操 | 在线播放波多野结衣 | 韩国三级做爰高潮 | 91美女在线观看 | 国产精品骚 | 香蕉a| 亚洲a图 | 天堂色综合 | 国产精品二区在线观看 | 毛片在线免费观看网址 | 免费一区二区三区视频在线 | 免费成人在线播放 | 日韩欧美片| 国产精品成人一区二区 | 影视av | 蜜桃香蕉视频 | 深夜视频在线 | 精品二区视频 | 国产免费黄色片 | 天天干狠狠爱 | 国产女主播福利 | 国产精品久久影视 | 久久久久久久久久久久久久免费看 | 亚洲av无码不卡 | 国产又好看的毛片 | 天堂а√在线中文在线新版 | 97福利社 | 羞羞的网站在线观看 | 东方av在线免费观看 | 伊人焦久影院 | 国产日韩欧美在线播放 | 香蕉国产精品 | 波多野结衣一区二区三区在线 | 欧美性xxxxx极品少妇 | 国产男女视频在线观看 | 有奶水的迷人少妇 | 18禁裸乳无遮挡啪啪无码免费 | 在线免费|