记录编号 17801 评测结果 AAAAAAAA
题目名称 王伯买鱼 最终得分 100
用户昵称 Gravatar苏轼 是否通过 通过
代码语言 C++ 运行时间 0.027 s
提交时间 2010-08-31 21:50:39 内存使用 0.26 MiB
显示代码纯文本
#include <cstdio>
using namespace std;

const int MAXN=35;

struct Node
{
	int v;
	Node *next;
	Node(int a,Node *b):v(a),next(b){}
};

Node *adj[MAXN];
int cost[MAXN];
int n,m;

void add(int a,int b)
{
	adj[a]=new Node(b,adj[a]);
	adj[b]=new Node(a,adj[b]);
}

bool get[MAXN];

int best,way[MAXN],expen,top;
void search(int dep,int money,int nowfish)
{
	if (n-dep+nowfish<best)return;
	if (dep==n)
	{
		if (nowfish>best||(nowfish==best&&money>expen))
		{
			expen=money;
			top=0;best=nowfish;
			for(int i=0;i<dep;i++)
				if (get[i])
					way[top++]=i;
		}
		return ;
	}
	if (m-money>=cost[dep])
	{
		Node *p;
		for(p=adj[dep];p;p=p->next)
			if (get[p->v])
				break;
		if (!p)
		{		
			get[dep]=true;
			search(dep+1,money+cost[dep],nowfish+1);
			get[dep]=false;
		}
	}
	search(dep+1,money,nowfish);
}

int main()
{
	freopen("fish.in","r",stdin);
	freopen("fish.out","w",stdout);
	scanf("%d%d",&m,&n);
//	printf("%d %d\n",m,n);
	for(int i=0,a,b;i<n;i++)
	{
		scanf("%d%d",&a,&b);
//		printf("%d %d\n",a,b);
		a--;
		cost[a]=b;
	}
	while(true)
	{
		int a,b;
		scanf("%d%d",&a,&b);
//		printf("%d %d\n",a,b);
		if (!a&&!b)break;
		a--,b--;
		add(a,b);
	}
	search(0,0,0);
	printf("%d %d\n",best,expen);
	for(int i=0;i<top;i++)
		printf("%d\n",way[i]+1);
	return 0;
}