程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> Uva 11181 Probability|Given(概率dp)

Uva 11181 Probability|Given(概率dp)

編輯:關於C++

 

Problem G
Probability|Given
Input:
Standard Input

Output: Standard Output

 

N friends go to the local super market together. The probability of their buying something from the market is \respectively. After their marketing is finished you are given the information that exactly r of them has bought something and others have bought nothing. Given this information you will have to find their individual buying probability.

 

Input

The input file contains at most 50 sets of inputs. The description of each set is given below:

 

First line of each set contains two integers N (1 ≤ N ≤ 20) and r(0 ≤ r ≤ N). Meaning of N and r are given in the problem statement. Each of the next N lines contains one floating-point number \ (0.1<\<1) which actually denotes the buying probability of the i-th friend. All probability values should have at most two digits after the decimal point.

 

Input is terminated by a case where the value of N and r is zero. This case should not be processes.

 

Output

For each line of input produce N+1 lines of output. First line contains the serial of output. Each of the next N lines contains a floating-point number which denotes the buying probability of the i-th friend given that exactly r has bought something. These values should have six digits after the decimal point. Follow the exact format shown in output for sample input. Small precision errors will be allowed. For reasonable precision level use double precision floating-point numbers.

 

Sample Input Output for Sample Input

3 2 
0.10 
0.20 
0.30 
5 1 
0.10 
0.10 
0.10 
0.10 
0.10 
0 0

Case 1:

0.413043

0.739130

0.847826

Case 2:

0.200000

0.200000

0.200000

0.200000

0.200000

 


Problem-setter: Shahriar Manzoor
Special Thanks: Derek Kisman


題意:有n個人,並且知道每個人買東西的概率,現在已知有r個人買了東西,依次求第i個人買東西的概率

思路:ans[i]保存有r個人買了東西的情況下並且第i個人買了東西的概率,all代表n給人中第r個買了東西的概率

 

 

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include


#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define MID(x,y) ((x+y)>>1)

#define eps 1e-8
//typedef __int64 ll;

#define fre(i,a,b)  for(i = a; i = a;i--)
#define mem(t, v)   memset ((t) , v, sizeof(t))
#define ssf(n)      scanf("%s", n)
#define sf(n)       scanf("%d", &n)
#define sff(a,b)    scanf("%d %d", &a, &b)
#define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
#define pf          printf
#define bug         pf("Hi\n")

using namespace std;

#define INF 0x3f3f3f3f
#define N 25

double ans[N];
double p[N];
int n,r;

double dfs(int pos,int left,double pp)
{
    if(pos>n) return left==0 ? pp : 0;

    double sum=0;

    if(left)
	{
	    sum+=dfs(pos+1,left-1,pp*p[pos]);
	    ans[pos]+=sum;
	}
    sum+=dfs(pos+1,left,pp*(1-p[pos]));
    return sum;
}

int main()
{
	int i,j,ca=0;

    while(sff(n,r),n+r)
	{
		fre(i,1,n+1)
		  scanf("%lf",&p[i]);

		memset(ans,0,sizeof(ans));

	   double all=dfs(1,r,1);
	   pf("Case %d:\n",++ca);
	   for(i=1;i<=n;i++)
			pf("%.6lf\n",ans[i]/all);
	}

  return 0;
}


 

 

 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved