1. 程式人生 > >lightoj1079(數學概率與期望)

lightoj1079(數學概率與期望)

題意:

哈利波特要去搶銀行;

現在給出一個概率p,和銀行的個數n;

接下去給出每個銀行可以搶到的錢,還有搶劫這個銀行被抓的概率;

問在被抓的概率小於等於p的情況下,最多搶到多少錢;

思路:

首先我們把被抓的概率轉化為可以逃跑的概率;

然後是一個01揹包的思想;

dp[j] 代表搶劫到 j 元錢,逃跑的概率;

那麼dp[j] = max( ( dp[j - m[i]] ) * p[i])

也就是不搶第i家銀行(那麼錢就是j - m[i]) 概率就是 dp[j - m[i]]  然後再搶了這家,那麼概率就變為( dp[j - m[i]] ) * p[i]

#include<cstdio>
#include<cstring>

const int N = 100000 + 5;
double d[N];
void init() {
	for(int i = 2; i < N; i++) {
		double sum = 0;
		int c = 0;
		for(int j = 1; j * j <= i; j++) {
			if(i % j == 0) {
				sum += d[j];
				c++;
				if(j != i / j) {
					sum += d[i / j];
					c++;
				}
			}
		}
		d[i] = (sum + c)/(c - 1);
	}
}
int main() {
	memset(d, 0, sizeof(d));
	init();
	int t;
	int cas = 1;
	scanf("%d",&t);
	while(t--) {
		int n;
		scanf("%d",&n);
		printf("Case %d: %.10lf\n",cas++,d[n]);
	}
}