【CDOJ 1355】柱爷与三叉戟不得不说的故事 【状压DP+子集枚举】

来源:互联网 发布:拓扑算法 编辑:程序博客网 时间:2024/06/11 17:52

柱爷与三叉戟不得不说的故事

Time Limit: 500/500MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)

在喵蛤蛤城,人人都知晓柱爷有一把传奇武器三叉戟.据传,这是一位在772002

年前陨落的强大守护者F91曾经使用过的12级灵能武器,拥有毁天灭地的力量

但只有很少人知道当柱爷获得三叉戟时,三叉戟的力量已经消失殆尽.为了能修复三叉戟的力量,柱爷苦心专研古籍,发现只有找到最神秘的15

种元素,将元素的力量重新注入到三叉戟中,三叉戟就能恢复到原来的力量,于是柱爷踏上了寻找神秘元素的旅行.

柱爷首先发现15

个由卿学姐掌控的地牢,里面正好有15种对应元素.冷静的柱爷没有贸然行动,经过一番详细的打听,柱爷得知了第i种元素需要Di的精力去获得;与此同时,柱爷还发现了由白学潘看守的N个洞穴,第i个洞穴中有Ai个不同的元素,分别是B1,B2,...,BAi,需要Ci

的精力去获得.

同种元素不得拥有多个,不然元素之间会产生强大的斥力,会发生爆炸;不能攻下一个洞穴后,留有元素不拿走,元素可能会辐射,伤害喵哈哈村的大爷......

但是柱爷岂是凡人?柱爷修复三叉戟时花费的总是最小的精力!

那么这个最小的花费是多少呢?

Input

第一行包括15

个正整数,第i个数表示Di

.

第二行包括一个整数表示N

.

接下来N

行,每行有一个整数表示Ai,后面紧接着Ai个不同的正整数,最后又一个正整数Ci

表示需要花费的精力.

数据保证:

  • 0N10000


  • 1Di20000


  • 0Ai5


  • 1Ci2000000


    Output

    输出一个整数ans

    :

    表示至少花ans

    的精力去修复三叉戟.

    Sample input and output

    Sample InputSample Output
    9599 11186 3513 3112 19106 1171 4254 4786 11880 19550 4793 17049 10779 11096 971354 10 1 8 11 12126453 14 9 15 16555603 7 3 14 11612625 13 5 9 2 11 7105120 980331
    141587

    Source

    2016 UESTC Training for Dynamic Programming


  • #include<cstdio>#include<iostream>#include<algorithm>#include<cmath>#include<cstring>using namespace std;typedef long long ll;const int maxn = 1000000;const long long int INF = 1e17+7;ll dp[maxn+10];int main(){int n=15,m;for(int i=1;i<maxn;i++)dp[i]=INF;for(int i=1;i<=n;i++)scanf("%lld",&dp[1<<(i-1)]);scanf("%d",&m);for(int i=1;i<=m;i++){int k,num=0;scanf("%d",&k);for(int j=1;j<=k;j++){int t;scanf("%d",&t);num+=(1<<(t-1));}ll tmp;scanf("%lld",&tmp);if(dp[num]>tmp)dp[num]=tmp;}for(int i=1;i<(1<<n);i++){for(int j=i;j;j=(j-1)&i)dp[i]=min(dp[i],dp[j]+dp[j^i]);}cout<<dp[(1<<n)-1];return 0;}


    1 0
    原创粉丝点击