ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

纪中暑假集训 2020.08.10【NOIP提高组】模拟 T1:【GDOI2007】夏娜的菠萝包

2020-08-11 08:00:50  阅读:248  来源: 互联网

标签:10 NOIP 菠萝包 搭配 值为 纪中 25 RC 美味


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

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。

反思&题解

比赛&正解思路: 数据那么小,暴力呀!(不过正解是状压DP,不过可以暴力用什么状压)考试的时候暴力细节打错了,炸剩20分。
反思: 实现细节要注意

CODE

#include<bits/stdc++.h>
using namespace std;
int t[25],d[25],k[25],e[25],dp[25][25],n,m,ans;
bool bz[25],bz1[25];
void dfs(int tot)
{
	if (tot>ans) ans=tot;
	int i;
	for (i=1;i<=m;i++)
	{
		bool flag=true;
		int j;
		for (j=1;j<=k[i];j++)
		{
			if (bz[dp[i][j]])
			{
				flag=false;
				break;
			}
		}
		if (flag)
		{
			int sum=0;
			for (j=1;j<=k[i];j++)
			{
				bz[dp[i][j]]=true;
				bz1[dp[i][j]]=true;
				sum+=t[dp[i][j]];
			}
			for (j=1;j<=n;j++)
			{
				t[j]-=d[j];
				if (d[j]<0) bz[j]=true;
			}
			dfs(tot+e[i]+sum);
			for (j=1;j<=k[i];j++)
			{
				bz[dp[i][j]]=false;
				bz1[dp[i][j]]=false;
			}
				
			for (j=1;j<=n;j++)
			{
				t[j]+=d[j];
				if (d[j]>=0 && bz1[j]==false) bz[j]=false;
			}
		}
	}
}
int main()
{
	while (1)
	{
		scanf("%d",&n);
		if (n==0) break;
		int i;
		for (i=1;i<=n;i++)
			scanf("%d%d",&t[i],&d[i]);
		scanf("%d",&m);
		for (i=1;i<=m;i++)
		{
			scanf("%d%d",&k[i],&e[i]);
			int j;
			for (j=1;j<=k[i];j++)
				scanf("%d",&dp[i][j]);	
		}
		memset(bz,false,sizeof(bz));
		memset(bz1,false,sizeof(bz1));
		ans=0;
		dfs(0);
		printf("%d\n",ans);
	} 
	return 0;
}

标签:10,NOIP,菠萝包,搭配,值为,纪中,25,RC,美味
来源: https://www.cnblogs.com/CMC-YXY/p/13473400.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有