機率統計(DP)

來源:互聯網
上載者:User

標籤:dp

問題描述
  產生n個∈[a,b]的隨機整數,輸出它們的和為x的機率。
輸入格式
  一行輸入四個整數依次為n,a,b,x,用空格分隔。
輸出格式
  輸出一行包含一個小數位和為x的機率,小數點後保留四位小數
範例輸入
2 1 3 4
範例輸出
0.3333
資料規模和約定
  對於50%的資料,n≤5.
  對於100%的資料,n≤100,b≤100.
題解:
這是一道典型的完全背包,但是在做的過程中遇到了一些波折。
dp[i][j]:挑選i個數字後得到j的機率。
dp[i][j]=dp[i-1][z]*1/sum;
每一種情況都要再乘一個1/sum,而情況與情況之間是加和的關係。
(最開始想用得到X數/總數),後來發現到最後實在太大了,100^100.所以用dp直接表示機率更好一點,剩下的就是一個完全背包了。
代碼實現:

#include <bits/stdc++.h>#define MAX 110using namespace std;double dp[MAX][MAX*MAX];int save[MAX];double sum;int N,a,b,X;int main(){    scanf("%d%d%d%d",&N,&a,&b,&X);    for( int i = 0; i < b-a+1; i++ )        save[i]=a+i;    sum = b-a+1;    memset(dp,0,sizeof(dp));    for( int i = 0; i < N; i++ )    {        for( int j = 0; j < b-a+1; j++ )        {            if( i == 0 )            {                dp[i][save[j]]=1/sum;                smax=max(smax,save[j]);            }            else            {                int smax=0;                int tem=0;                for( int z = 0; z < MAX*MAX-save[j]; z++ )                {                    if( dp[i-1][z] != 0 )                    {                        dp[i][z+save[j]]+=(dp[i-1][z]*1/sum);                        tem=max(smax,z+save[j]);                    }                    if( z > smax )                    {                        smax=tem;                        break;                    }                }            }        }    }    printf("%.4lf\n",dp[N-1][X]);}

機率統計(DP)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.