HDU 4336:Card Collector 期望+状压
Card Collector
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=4336
题意:
去商店里买零食,每包零食里最多有1张卡片,也有可能没有,问要集齐所有n(n≤20)种卡片所需要购买零食个数的期望。
题解:
设dp[i](二进制,对应位为1表示已经有该卡片)为以当前状态为起点还需要购买零食个数的期望,则dp[0]即答案
对DP求解期望有问题的可以看下这里
代码
#include<stdio.h>
#include<string.h>
const int N=20;
double dp[1<<N],p[N],x;
int main()
{
	  int n;
	  while(~scanf("%d",&n))
	  {
		    dp[(1<<n)-1]=0.0;
		    for(int i=0;i<n;++i)
		    scanf("%lf",&p[i]); 
		    for(int j=(1<<n)-2;j>=0;--j)
		    {
			      x=0;dp[j]=0.0;
			      for(int k=0;k<n;++k)
			      {
				        if(!((1<<k)&j))
				        dp[j]+=dp[j+(1<<k)]*p[k],x+=p[k];
			      }
			      dp[j]=(dp[j]+1.0)/x;
		    }
		    printf("%.5f\n",dp[0]);
	  }
}
                    
                
                
            
        
浙公网安备 33010602011771号