CF RCC 2014 Warmup (Div. 2) D. Cunning Gena

LINK

题意 : 一个人要完成m道题目, 他不会,只能去求助她的n个朋友,每个朋友 可以完成mi道题目,需要报酬xi,(拿到报酬后把他会的题目可以全部完成)。
同时 每个朋友 去做题目 需要这个人的电脑 有ki个monitor, monitor价值都为b。(即最终要有monitor的个数为 她选择的朋友中的ki的最大值。)
如何选择 使得 总的花费最少,做完所有的题目。
m很小 (20), 想到了状态压缩dp, 没有monitor这个东西的话,就是很裸的 状态压缩dp。
我们可以 把n个朋友按照,所需monitor的数量从大到小排序,
dp[i][j]表示从1~ith朋友中选择 达到j这个状态,最小的花费(不包括monitor),dp[i][j]=min(dp[i][j],dp[i-1][ k| sta[t]]+x[t]) 最终结果为ans=min(ans,dp[i][(1<<m)-1]+b*k[i]);

这样表示的话 会MLE,考虑到每个状态dp[i][]只会和dp[i-1][]有关, 所以可以用滚动数组 就可以A掉了。

进一步优化的话,可以搞成一维,类似背包,状态转移是逆序遍历就可以了。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<cmath>
#include<queue>
#include<map>
#include<set>
using namespace std;
#define INF 2e18
typedef __int64 LL;
#define N 105
#define M 20
LL n,m,b,dp[1<<M];
struct node
{
	LL x,k,m,save;
}num[N];
int cmp(node x,node y)
{
	return x.k<y.k;
}
int main()
{
#ifndef ONLINE_JUDGE
    freopen ("in.txt" , "r" , stdin);
#endif
	scanf("%I64d%I64d%I64d",&n,&m,&b);
	LL tmp;
	for(int i=1;i<=n;i++)
	{
		scanf("%I64d%I64d%I64d",&num[i].x,&num[i].k,&num[i].m);
		num[i].save=0;
		for(int j=1;j<=num[i].m;j++)
		{
			scanf("%I64d",&tmp); num[i].save|=(1<<(tmp-1));
		}
	}
	sort(num+1,num+1+n,cmp);
	for(int i=1;i<(1<<m);i++) dp[i]=INF;
	dp[0]=0;
	LL ans=INF;
	for(int i=1;i<=n;i++)
	{
		for(int j=(1<<m)-1;j>=0;j--)
		{
			int next=j|num[i].save;
			dp[next]=min(dp[next],dp[j]+num[i].x);
		}
		ans=min(ans,dp[(1<<m)-1]+num[i].k*b);
	}
	if(ans>=INF) printf("-1\n");
	else printf("%I64d\n",ans);
    return 0;
}

 

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可 6私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值