zoukankan      html  css  js  c++  java
  • 【BZOJ1076】【SCOI2008】—奖励关(期望+状压dp)

    传送门

    考虑到当前选的物品会对后面决策产生影响,不好处理选还是不选,所以考虑从后往前递推

    f[i][sta]f[i][sta]表示第ii轮,已选的状态为stasta时,后面最多可以得到的价值

    然后就是简单题了

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define re register
    inline int read(){
        char ch=getchar();
        int res=0,f=1;
        while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
        while(isdigit(ch)) res=(res<<3)+(res<<1)+(ch^48),ch=getchar();
        return res*f;
    }
    const int K=105;
    const int N=17;
    double a[N],f[K][1<<15],ans;
    int n,k,pre[N];
    int main(){
    	k=read();
    	n=read();
    	for(int i=1;i<=n;i++){
    		a[i]=read();int x=read();
    		while(x){
    			pre[i]+=(1<<(x-1));
    			x=read();
    		}
    	}
    	int sta=(1<<n)-1;
    	for(int p=k;p;p--){
    		for(int i=0;i<=sta;i++){
    			for(int j=1;j<=n;j++){
    				if((i&pre[j])==pre[j])
    					f[p][i]+=max(f[p+1][i],f[p+1][i|(1<<(j-1))]+a[j]);
    				else f[p][i]+=f[p+1][i];
    			}
    			f[p][i]/=n;
    		}
    	}
    	printf("%.6lf",f[1][0]);
    }
  • 相关阅读:
    数组操作方法和迭代方法
    三元运算符
    数组求和/去重
    javascript保留字
    window.onload和document.ready区别
    alert()和consloe.log()区别
    Eventutil函数封装
    前端中的事件流
    react的生命周期
    小程序初体验
  • 原文地址:https://www.cnblogs.com/stargazer-cyk/p/11145671.html
Copyright © 2011-2022 走看看