题解 P2473 [SCOI2008]奖励关
原题传送门:P2473 [SCOI2008]奖励关
题目简介:
共有
数据范围:
解题思路:
我们可以发现
经过思考,我们基本上都可以推出,此轮的期望值=(上一轮所有可行状态的期望值+此轮所有对应可行状态的物品价格)的总和/总情况数。
再分情况讨论,设
那么式子应为
否则
但是我们需要计算期望值,就是再除以总情况数,这个时候我们会发现有的情况在转移时是不存在的,总情况数是不定的,所以无法计算,而且任何状态都有可能是
上面的式子修改后如下
否则
这样的话每一个状态转移后的
这样的话从
代码如下:
#include<bits/stdc++.h>
using namespace std;
int K,n,v[16],state[16];
double dp[105][1<<15];
inline double Max(register double a,register double b){
return a>b?a:b;
}
int main(){
scanf("%d%d",&K,&n);
int tmp;
for(int i=1;i<=n;++i){
scanf("%d",&v[i]);
while(~scanf("%d",&tmp)){
if(!tmp)break;
state[i]|=(1<<(tmp-1));
}
}
for(int i=K;i>=1;--i){
for(int j=0;j<(1<<n);++j){
for(int k=1;k<=n;++k){
if((j&state[k])==state[k])dp[i][j]+=Max(dp[i+1][j],dp[i+1][j|(1<<(k-1))]+v[k]);
else dp[i][j]+=dp[i+1][j];
}
dp[i][j]/=n;
}
}
printf("%.6lf",dp[1][0]);
return 0;
}