【codeVS】2651 孔子教学——同桌

将所有情况枚举: 总感觉dfs  和dp 有千丝万缕关系

题目描述 Description

孔子是我国古代著名的教育家。他有先见之明,可以判断学生出师以后给他带来的声望。声望共有三种“G”“M”“B”,“G”可以给他带来3点声望,“M”可以给他带来2点声望,“B”可以让他丢失2点声望。每个学生出师后的声望为ai。当然,学生出师的时间不同,第i个的学生需要bi个单位时间。他每次只能教1名学生。他共有x个学生,有y个单位时间,但必须教z名学生。求孔子可获得的最大声望。

输入描述 Input Description

输入格式:

x z y

a1 b1

……

……

……

ax bx

 

输出描述 Output Description

输出格式:

ans(为最大声望)

无解输出- 1

 

样例输入 Sample Input

例一:

2 2 2

G 0

G 2

例二:

4 2 2

B 1

B 1

G 4

M 3

样例输出 Sample Output

例一:

6

例二:

-4

数据范围及提示 Data Size & Hint

x<=10,z<=a,y<=200,声望可能为负数,保证时间大于0,但不一定有解。

T解答:

dfs(i,tot+1,pride+s[i].w,time-s[i].p);


#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define f(i,l,r) for(int i=l;i<=r;++i)
#define g(i,l,r) for(int i=l;i>=r;--i)
int x,y,z,r,ans=-0x7fffffff;
bool v[11]; 
struct {
	char c ;
	int w,p;
}s[12];
void dfs(int now,int tot,int pride,int time){
	if(tot>=z) ans=max(ans,pride);
	if(tot==x) return;
	if(now==x) return;
	f(i,now+1,x){
		if(time>=s[i].p&&!v[i]){
			dfs(i,tot+1,pride+s[i].w,time-s[i].p);
			v[i]=false;
		} 
	}
}
int main(){
	cin>>x>>z>>y;
	f(i,1,x){
		cin>>s[i].c>>s[i].p;
		switch (s[i].c)
		{
		case 'G':     
			s[i].w=3;	break;
		case 'M':   
			s[i].w=2;	break;
		case 'B':      
			s[i].w=-2;	break;
		default:
			break;
		} 
	}
	dfs(0,0,0,y);
	if(ans==-0x7fffffff) cout<<-1<<endl;
	else cout<<ans<<endl;
} 




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值