[CF 417D]Cunning Gena:状压DP
2017-04-19 10:22
337 查看
点击这里查看原题
先把每个人按k升序排序, f [ i ] 表示完成状态i的最小花费,计算出显示器数量分别为 k [ j ] 时 f [ ( 1 < < m ) - 1 ] 的最小值,ans = min { f [ ( 1 < < m ) - 1 ] + k [ j ] * b }。
先把每个人按k升序排序, f [ i ] 表示完成状态i的最小花费,计算出显示器数量分别为 k [ j ] 时 f [ ( 1 < < m ) - 1 ] 的最小值,ans = min { f [ ( 1 < < m ) - 1 ] + k [ j ] * b }。
/* User:Small Language:C++ Problem No.:417D */ #include<bits/stdc++.h> #define ll long long #define inf 999999999 using namespace std; const int M=(1<<20)+5; int n,m; ll ans=5e18,f[M],b; struct no{ ll x,k; int d; bool operator<(const no b)const{ return k<b.k; } }p[105]; void cal(int x){ for(int i=0;i<(1<<m);i++) f[i|p[x].d]=min(f[i|p[x].d],f[i]+p[x].x); ans=min(ans,f[(1<<m)-1]+p[x].k*b); } int main(){ // freopen("data.in","r",stdin);// ios::sync_with_stdio(0); cin>>n>>m>>b; for(int i=1;i<=n;i++){ int tot,x; cin>>p[i].x>>p[i].k>>tot; while(tot--){ cin>>x; p[i].d|=1<<(x-1); } } sort(p+1,p+n+1); for(int i=1;i<(1<<m);i++) f[i]=5e18; f[0]=0; for(int i=1;i<=n;i++) cal(i); if(ans>=5e18) ans=-1; cout<<ans<<endl; return 0; }
相关文章推荐
- CF 417D - Cunning Gena--状态压缩DP
- RCC 2014 Warmup (Div. 2) D. Cunning Gena(状压DP)
- CF 375C Circling Round Treasures [DP(spfa) 状压 射线法]
- codeforces 417D 状压DP
- cf 401D. Roman and Numbers 数位dp,状压
- cf 11D A Simple Task(状压DP)
- CF855E,状压数位DP
- poj3254(Corn Fields)状压dp
- poj 3254 Corn Fields (状压dp)
- hdu 4539(状压dp)
- POJ1185:炮兵阵地(状压dp)
- POJ 3254 Corn Fields (状压dp)
- BZOJ 3195: [Jxoi2012]奇怪的道路 | 状压DP
- [BZOJ2734][HNOI2012]集合选数(状压DP)
- POJ 3254 Corn Fields (状压dp)
- hdu 2686(状压dp)
- HDU5418.Victor and World(状压DP)
- DP - CF 611D New Year and Ancient Prophecy
- [LOJ#2290][THUWC 2017][概率][状压][DP][陈老师神题]随机二分图
- 【ZJOI2017 Round1练习】D4T2 trie(贪心,状压DP)