生成n個∈[a,b]的隨機整數,輸出它們的和為m的概率。
輸入格式
一行輸入四個整數依次為n,a,b,x,用空格分隔。
輸出格式
輸出一行包含乙個小數字和為m的概率,小數點後保留四位小數
2 1 3 4
0.3333對於50%的資料,n≤5.
對於100%的資料,n≤100,b≤100.
一開始我是直接記憶搜尋去解的
然後我發現後台資料很大,以至於使用
typedef
long
long ll;
也不能夠表達出所有的情況 (b-1+1)n
於是換一種方法
狀態定義:
#define maxlen 114
#define maxsum 11451
// dp[i][j]表示:前 i 個數字加和等於 j 的概率
double dp[maxlen]
[maxsum]
;
狀態轉移:
在第i個數字選擇了x的情況下(或者說dp[i-1][j-x]的概率是組成dp[i][j] 的概率的一部分,因為我們不可能只考慮選x,應該考慮選取a到b之間的所有整數)dp[i][j] 的概率,就是dp[i-1][j-x]的概率
所以推得最終狀態轉移方程:
sum表示求和,1
/(b-a+
1)是第i個數字選擇x的概率,x範圍[a, b]
dp[i]
[j]=
sum(dp[i-1]
[j-x])*
1/(b-a+
1)
for
(int i=
2; i<=n; i++)}
dp[i]
[j]/
=(b-a+1)
;}}
#include
#include
using
namespace std;
#define maxlen 114
#define maxsum 11451
// dp[i][j]表示:前 i 個數字加和等於 j 的概率
double dp[maxlen]
[maxsum]
;int n, a, b, m;
intmain()
}// 計算第乙個數能表示 i 的概率
for(
int i=
0; i<=m; i++)}
for(
int i=
2; i<=n; i++)}
dp[i]
[j]/
=(b-a+1)
;}}printf
("%.4lf\n"
, dp[n]
[m])
;return0;
}
藍橋杯 拿糖果 動態規劃解法
上次寫過乙個類似的,用的dfs 記憶 媽媽給小b買了n塊糖!但是她不允許小b直接吃掉。假設當前有m塊糖,小b每次可以拿p塊糖,其中p是m的乙個不大於根號下m的質因數。這時,媽媽就會在小b拿了p塊糖以後再從糖堆裡拿走p塊糖。然後小b就可以接著拿糖。現在小b希望知道最多可以拿多少糖。輸入格式 乙個整數n...
藍橋杯 乘積最大II 動態規劃解法
因為資料不大,存在 暴力解法 今年是國際數學聯盟確定的 2000 世界數學年 又恰逢我國著名數學家華羅庚先生誕辰90周年。在華羅庚先生的家鄉江蘇金壇,組織了一場別開生面的數學智力競賽的活動,你的乙個好朋友xz也有幸得以參加。活動中,主持人給所有參加活動的選手出了這樣一道題目 設有乙個長度為n的數字串...
藍橋杯 概率計算 (概率DP)
題目傳送 藍橋杯 概率計算 時間限制 1.0s 記憶體限制 256.0mb 錦囊1 錦囊2 錦囊3 問題描述 生成n個 a,b 的隨機整數,輸出它們的和為x的概率。輸入格式 一行輸入四個整數依次為n,a,b,x,用空格分隔。輸出格式 輸出一行包含乙個小數字和為x的概率,小數點後保留四位小數 樣例輸入...