Description

问题描述:
夏娜很喜欢吃菠萝包,她的经纪人RC每半个月就要为她安排接下来的菠萝包计划。今天是7月份,RC又要去商场进货买菠萝包了。
这次RC总共买了N种菠萝包,每种一个。每个菠萝包都有一个初始美味值Ti,每过一天就会减少Di,即第2天美味值为Ti-Di,第3天为Ti-2*Di,依此类推。一旦美味值减为负数,那个包就坏掉了,不能吃了。
RC每天都要为夏娜安排当天吃菠萝包的组合,这些组合不是随意的,而是只能从夏娜喜欢的M种搭配中挑选一种。每种搭配是由Ki个菠萝包组成的,一种搭配的总美味值是这Ki个菠萝包当天的美味值之和再加上一个额外的搭配美味值Ei。不过要注意,一旦某种搭配的其中一个菠萝包坏掉了,这个搭配就不能选用了。而且,有可能存在两个搭配,里面的组合是一样的,但额外的搭配美味值却不同。
RC想让可爱的夏娜尽可能地吃得美味,因此希望能找出一种最优的方案,让小夏娜吃上若干天的菠萝包,这些天的美味值之和最大。
但RC面临着两个邪恶的敌人,一个叫bug,一个叫zzy,他们也想抢夺这个经纪人之位,因此要是他们提出更优的方案,RC就可能会失去他的夏娜了。那么,你们能帮帮这个可怜的RC吗?

Input

输入格式:
输入文件包含多组数据。
每组数据的第一行为一个正整数N(N<=14),表示菠萝包的种数,按1-N编号。
接下来N行,每行两个正整数Ti(Ti<100)和Di(Di<100),表示第i种菠萝包的初始美味值和每天递减值。
第N+2行为一个正整数M,表示搭配的种数。
接下来M(M<=20)行,每行先是一个正整数Ki,表示组成这个搭配的菠萝包数目,然后是一个非负整数Ei(Ei<100),表示这种搭配额外的美味值,最后是Ki个整数,每个整数为菠萝包的编号。
当N=0时表示输入结束。

Output

输出格式:
对于每组输入数据输出一行,仅包含一个整数,表示最大的美味值之和。

Sample Input

输入样例:
2
3 1
4 2
2
1 1 1
1 1 2
2
3 1
4 2
3
1 1 1
1 1 2
2 2 1 2
0

Sample Output

输出样例:
8
9

Data Constraint

Hint

样例说明:
对于第一个样例,只有两个方案:
1、 第一天选择搭配1,即吃编号1的菠萝包,美味值为3+1=4;第二天选择搭配2,即吃编号为2的菠萝包,美味值为2+1=3。此时已把菠萝包都吃完了,总和为4+3=7.
2、 第一天选择搭配2,即吃编号为2的菠萝包,美味值为4+1=5;第二天选择搭配1,即吃编号1的菠萝包,美味值为2+1=3,此时已把菠萝包都吃完了,总和为5+3=8。
因此,第2个方案为最优方案,最大美味值总和为8.
对于第二个样例,除了上述两个方案,还有第三个:
3、 第一天选择搭配3,即编号为1和2的菠萝包一起吃,美味值为3+4+2=9。此时已经把菠萝包都吃完了,总和即为9.
虽然第3个方案只能吃1天,但因为其总和最大,所以选择第3个方案,答案为9。

Solution

状压dp。设f[ i ][ S ]表示第 i 天,吃了状态为S的菠萝包的最大美味值。

f[ 0 ][ 0 ]=0

转移枚举每种搭配以及菠萝包的种类,将每个包的美味度算出来加到f[ i +1 ][ T ]里面。

Code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define I int
#define ll long long
#define F(i,a,b) for(I i=a;i<=b;i++)
#define Fd(i,a,b) for(I i=a;i>=b;i--)
#define N 22
using namespace std;
I n,m,T,x,a[N][N],t[N],d[N],k[N],st[N],mt[N],e[N],f[N][20000],now,bz,tot,ans,inf;
char c;
void R(I &x){x=0;c=getchar();while(c<'0'||c>'9') c=getchar();while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
}
I main(){while(1){scanf("%d",&n);if(!n) return 0;memset(f,-127,sizeof f);inf=f[0][0];f[0][0]=ans=0;F(i,1,n) scanf("%d%d",&t[i],&d[i]);scanf("%d",&m);F(i,1,m){st[i]=mt[i]=0;scanf("%d%d",&k[i],&e[i]);F(j,1,k[i]){scanf("%d",&a[i][j]);st[i]|=(1<<a[i][j]-1);mt[i]=max(mt[i],t[a[i][j]]/d[a[i][j]]+1);}}F(i,0,min(n,m)-1){F(S,0,(1<<n)-1) if(f[i][S]>=0){F(l,1,m){if((st[l]&S)||mt[l]<i+1) continue;T=now=0;F(j,1,k[l]){T|=(1<<a[l][j]-1);now+=t[a[l][j]]-d[a[l][j]]*i;}f[i+1][S+T]=max(f[i+1][S+T],f[i][S]+now+e[l]);ans=max(ans,f[i+1][S+T]);}}}printf("%d\n",ans);}
}

1040. 【GDOI2007】夏娜的菠萝包【推荐】相关推荐

  1. 一句话以上题解及注意事项整理已完成的题目(1)

    jdfz.com 1001 A+B 1006 pla 一维DP+单调栈优化 1007 美食家 贪心策略,尽可能多选 1008 牛排序 二分查找+贪心策略 1009 护花 贪心策略,每次移动y/x最大的 ...

  2. 剪切工具怎么用_原创度检测工具是怎么用的?优质的内容更容易获得平台推荐...

    原创度检测工具是怎么用的?优质的内容更容易获得平台推荐,原创度检测现在不仅仅限于论文和seo方面的文章了,现在很多自媒体文章也需要用到原创度检测工具,今天就跟大家分享一款自媒体文章常用的原创检测工具, ...

  3. 幸福的港湾—1040出局证的真伪

    对于对异地连锁经营行业的认识来说,首先让人想到的应该是"幸福的港湾"这部纪录片.然而其内容展现的模式是不是传销推荐阅读幸福的港湾是传销吗,在这里笔者就不在重复讲述.今天谈论的是关于 ...

  4. 迁移学习——论文集推荐

    来自PaperWeekly的CSDN 文章 14 篇论文为你呈现「迁移学习」研究全貌 | 论文集精选 #04 迁移学习对于人类来说,就是掌握举一反三的学习能力.对于计算机而言,所谓迁移学习,就是从一个 ...

  5. 机器人 零境交错吧_电击文库零境交错角色大全 最强角色选择推荐及属性数据汇总[多图]...

    电击文库零境交错角色在游戏里面有很多,类型也不一样,有的伤害比较高,有的辅助效果比较明显,具体哪个比较好呢?下面是友情MT为大家带来的电击文库零境交错角色大全,最强角色选择推荐及属性数据汇总,希望能帮 ...

  6. 机器人 零境交错吧_电击文库零境交错新手最强角色推荐 哪个组合最厉害

    第1页: 展开 电击文库零境交错新手最强角色推荐,在游戏中很多玩家都对于怎么选择角色非常头疼,那么哪些角色比较好用呢?下面就一起来看一下吧. 目前来说,游戏角色分为物理,魔法,魔法加物理三种加成方式. ...

  7. 微信小程序源码推荐 这个很实用 学习地址

    wx-gesture-lock  微信小程序的手势密码 WXCustomSwitch 微信小程序自定义 Switch 组件模板 WeixinAppBdNovel 微信小程序demo:百度小说搜索 sh ...

  8. ML之RL:基于MovieLens电影评分数据集利用强化学习算法(多臂老虎机+EpsilonGreedy策略)实现对用户进行Top电影推荐案例

    ML之RL:基于MovieLens电影评分数据集利用强化学习算法(多臂老虎机+EpsilonGreedy策略)实现对用户进行Top电影推荐案例 目录 基于MovieLens电影评分数据集利用强化学习算 ...

  9. 【golang程序包推荐分享】go-ini、viper、godoc

    [golang程序包推荐&分享]go-ini.viper.godoc 一.go-ini 1.程序包简介 2.下载安装 3.简单使用[截取自官网] 二.viper 1.程序包简介 2.下载安装 ...

  10. 【快速上手mac必备】常用优质mac软件推荐(音视频、办公、软件开发、辅助工具、系统管理、云存储)

    本文章的主要内容是我作为一名大四学生.准程序员.up主这三种身份来给大家推荐一下 mac 上好用的软件以及工具.本人也是从去年9月份开始从windows阵营转移到了mac阵营,刚开始使用的时候,也曾主 ...

最新文章

  1. js 、jq强化复习
  2. 前端学习笔记day01 html 标签之音频 embed+audio+video
  3. java实现-两个栈实现一个队列和两个队列实现一个栈
  4. 内表使用Binary Search的限制
  5. 编程方法学6:操作符
  6. Java 8:开发人员怎么看?
  7. Windows消息队列一
  8. caffe安装 cuda安装 opencv安装 cudnn安装 python相关依赖库安装
  9. php使用ftp远程上传文件类(解决主从文件同步问题的简单方法)
  10. 【pytorch】torch.cat()函数
  11. javascript学习一、js的初步了解
  12. Xcode 运行程序,左侧memory 不显示内存
  13. mysql ulimit_Ubuntu 16.04 装机后如何永久更改ulimit和修改MySQL的存储路径datadir
  14. MATLAB的sum函数
  15. java基础——java学习心得
  16. 实测PD18W/30W/65W充电器给iPhone xs充电快慢对比
  17. 未来的计算机100字的小短文,关于电脑作文100字
  18. 归零的心态,做好团队回顾
  19. pwm超详细解读,大佬细说pwm的控制方式
  20. .net linux 界面设计,.NET Core3.0开发Liunx桌面应用程序

热门文章

  1. 永不消逝的电波(一):无线电入门篇
  2. 创维电视盒子导致网络瘫痪诡异事件处理方法(openwrt端口隔离)
  3. 基于Boostrap+jsp+spring+mysql的音乐推荐系统
  4. JavaWeb的体育用品商店的设计与实现
  5. 华为路由器时区以及时间配置
  6. stm32(十八)TFT-LCD
  7. 腾讯云通信IM集成踩坑记
  8. 让你快速了解外汇EA
  9. 最好的年终奖,是你拥有随时跳槽的能力
  10. G-05 校验ISBN-10编码 (10 分)