面接問題60:n個のサイコロの点数

2068 ワード

タイトルの説明
  • n個のサイコロを地面に投げ、すべてのサイコロが上を向いている点数の和はs
  • である.
  • nを入力、sのすべての可能な値が現れる確率
  • を印刷する.
    タイトル解読
  • 剣指Offer 294
  • コードC++
  • 構想一、再帰実現
  • #include
    #include
    #include
    using namespace std;
    
    class Solution {
    public:
        void getprobability(int n){
            vector result(6*n - n +1, 0);
            
            for(int i=1; i <= 6; i++){
                probability(n, n, i, result);
            }
            
            int total = pow(6, n);
            for(int i=0; i < result.size(); i++){
                cout<& result){
            if(current == 1){
                result[sum - n]++;
            }
            else{
                for(int i=1; i <= 6; i++){
                    probability(n, current-1, sum+i, result);
                }
            }
        }
    };
    
    int main(){
        Solution ss;
        
        int n = 6; // n       
        ss.getprobability(n);
    }
    
  • 構想二、循環実現
  • #include
    #include
    #include
    using namespace std;
    
    class Solution {
    public:
        void getprobability(int n){
            int number = 6;
            int temp[2][number*n + 1];
            int flag = 0;
    
            for(int i=0; i< number*n+1; i++){
                temp[0][i] = 0;
                temp[1][i] = 0;
            }
    
            for(int i=1; i <= number; i++){
                temp[flag][i] = 1;
            }
    
            for(int k=2; k <= n; k++){
                for(int i=0; i < k; i++){
                    temp[1-flag][i] = 0;
                }
    
                for(int i=k; i <= number*k; i++){
                    temp[1-flag][i] = 0;
                    for(int j=1; j<=i && j<=number; j++){
                        temp[1-flag][i] += temp[flag][i-j]; 
                    }
                }
                flag = 1 - flag;
            }
    
            int total = pow(6, n);
            for(int i=n; i <= n*number; i++){
                cout<

    展望をまとめる