codeforce 417D Cunning Gena (状压DP)

原题地址:http://codeforces.com/problemset/problem/417/D

题意:

Gena 为了解决m个问题,请他的朋友们帮忙,其中第i个朋友可以解决某mi个问题,需要花费xi卢布,并且要求安装至少ki个显示器,每个显示器需要b卢布。

问解决所有问题需要多少多少卢布

题解

考虑问题数目很小,可以状压DP。

dp[S]表示当前状态的最优解,通过位运算进行转移。

考虑|没有逆运算,所以只能正推更新。

首先把朋友按照k排序,避免k的干扰。

dp[][0]和dp[][1]分别表示考虑显示器花费和不考虑显示器花费的最小值

#include<bits/stdc++.h>

#define clr(x,y) memset((x),(y),sizeof(x))

using namespace std;
typedef long long LL;

const int maxn=(1<<20);
const LL inf=2e18;

struct Node
{
    LL x,k,m;
    int S;

    bool operator < (const Node& a) const
    {
        return k<a.k;
    }
};

LL dp[maxn+5][2];
Node f[105];

LL n,m,b;

int main(void)
{
    #ifdef ex
    freopen ("../in.txt","r",stdin);
    //freopen ("../out.txt","w",stdout);
    #endif

    scanf("%I64d%I64d%I64d",&n,&m,&b);
    for (int i=1;i<=n;++i)
    {
        scanf("%I64d%I64d%I64d",&f[i].x,&f[i].k,&f[i].m);
        int q;
        for (int j=1;j<=f[i].m;++j)
        {
            scanf("%d",&q);
            --q;
            f[i].S=f[i].S|(1<<q);
        }
    }

    sort(f+1,f+1+n);

    int S=(1<<m)-1;
    dp[0][0]=0;
    dp[0][1]=0;
    for (int i=1;i<=S;++i)
        for (int j=0;j<=1;++j)
            dp[i][j]=inf;

    for (int i=1;i<=n;++i)
    {
        //printf("%d\n",f[i].S);
        for (int j=S;j>=0;--j)
        {
            if (dp[j][0]==inf) continue;
            int tS=j|f[i].S;
            dp[tS][0]=min(dp[tS][0],dp[j][0]+f[i].x);
            dp[tS][1]=min(dp[tS][1],dp[j][0]+f[i].x+f[i].k*b);

            //printf("%d %d %d\n",tS,i,dp[tS][1]);
        }
    }

    if (dp[S][1]==inf) printf("-1\n");
    else printf("%I64d\n",dp[S][1]);
}
时间: 2024-10-20 11:30:07

codeforce 417D Cunning Gena (状压DP)的相关文章

COdeforces#417D Cunning Gena(状压DP)

A boy named Gena really wants to get to the "Russian Code Cup" finals, or at least get a t-shirt. But the offered problems are too complex, so he made an arrangement with his n friends that they will solve the problems for him. The participants

Codeforces 417D Cunning Gena(状态压缩dp)

题目链接:Codeforces 417D Cunning Gena 题目大意:n个小伙伴.m道题目,每一个监视器b花费,给出n个小伙伴的佣金,所须要的监视器数,以及能够完毕的题目序号. 注意,这里仅仅要你拥有的监视器数量大于小伙伴须要的监视器数量就可以. 求最少花费多少金额能够解决全部问题. 解题思路:dp[i],i为一个二进制数.表示完毕这些题目的最小代价,可是这里要注意,由于有个监视器的数量.普通情况下要开一个二维的状态.可是2^20次方有一百万,再多一维的数组会超内存,所以我的做法是将每一

CF417D--- Cunning Gena(排序+状压dp)

A boy named Gena really wants to get to the "Russian Code Cup" finals, or at least get a t-shirt. But the offered problems are too complex, so he made an arrangement with his n friends that they will solve the problems for him. The participants

ZOJ3305Get Sauce 状压DP,

状压DP的题目留个纪念,首先题意一开始读错了,搞了好久,然后弄好了,觉得DFS可以,最后超时,修改了很久还是超时,没办法看了一下n的范围,然后觉得状压可以,但是没有直接推出来,就记忆化搜索了一下,可是一直错,莫名奇妙,然后没办法看了一下题解,发现了下面这个比较好的方法,然后按照这个方程去推,然后敲,也是WA了好多把,写的太搓了,没人家的清楚明了,唉~也算是给自己留个纪念,状压一直做的都不太好~唉~还好理解了, 参考了  http://blog.csdn.net/nash142857/articl

poj 2411 Mondriaan&#39;s Dream(状压DP)

Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 12232   Accepted: 7142 Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producing the drawings in his 'toilet series

(状压dp)uva 10817 Headmaster&#39;s Headache

题目地址 1 #include <bits/stdc++.h> 2 typedef long long ll; 3 using namespace std; 4 const int MAX=1e5+5; 5 const int INF=1e9; 6 int s,m,n; 7 int cost[125]; 8 //char sta[MAX]; 9 string sta; 10 int able[125]; 11 int dp[125][1<<8][1<<8]; 12 in

HDU5816 Hearthstone(状压DP)

题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5816 Description Hearthstone is an online collectible card game from Blizzard Entertainment. Strategies and luck are the most important factors in this game. When you suffer a desperate situation an

HDU 4336 容斥原理 || 状压DP

状压DP :F(S)=Sum*F(S)+p(x1)*F(S^(1<<x1))+p(x2)*F(S^(1<<x2))...+1; F(S)表示取状态为S的牌的期望次数,Sum表示什么都不取得概率,p(x1)表示的是取x1的概率,最后要加一因为有又多拿了一次.整理一下就可以了. 1 #include <cstdio> 2 const int Maxn=23; 3 double F[1<<Maxn],p[Maxn]; 4 int n; 5 int main() 6

Travel(HDU 4284状压dp)

题意:给n个城市m条路的网图,pp在城市1有一定的钱,想游览这n个城市(包括1),到达一个城市要一定的花费,可以在城市工作赚钱,但前提有工作证(得到有一定的花费),没工作证不能在该城市工作,但可以走,一个城市只能工作一次,问pp是否能游览n个城市回到城市1. 分析:这个题想到杀怪(Survival(ZOJ 2297状压dp) 那个题,也是钱如果小于0就挂了,最后求剩余的最大钱数,先求出最短路和 Hie with the Pie(POJ 3311状压dp) 送披萨那个题相似. #include <