比赛 |
20100421 |
评测结果 |
AWWEEEEE |
题目名称 |
王伯买鱼 |
最终得分 |
12 |
用户昵称 |
.Xmz |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2010-04-21 09:22:52 |
显示代码纯文本
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
const int oo=2000000000;
int limit,n,v[50];
struct fish
{
int v,id;
}P[50];
bool operator <(fish a,fish b){return a.v-b.v;}
struct edge
{
int t;
edge *next;
}E[5000],*V[50];
int eh;
inline void addedge(int a,int b)
{
E[++eh].next=V[a]; V[a]=E+eh; V[a]->t = b;
E[++eh].next=V[b]; V[b]=E+eh; V[b]->t = a;
}
void init()
{
scanf("%d%d",&limit,&n);
for (int i=1;i<=n;i++)
scanf("%d%d",&P[i].id,&P[i].v);
sort(P+1,P+n);
int a,b;
do
{
scanf("%d%d",&a,&b);
if (a!=0 && b!=0) addedge(a,b);
}while (a!=0 && b!=0);
}
int num[50],cost,ge,anscost,ansge,i;
bool y[50],ansy[50];
void dfs(int u)
{
i++;
if (u>n)
{
if (cost<=limit)
{
if (ge>ansge)
{
ansge=ge;
anscost=cost;
memcpy(ansy,y,sizeof(y));
}
else if (ge==ansge && anscost>cost)
{
anscost=cost;
memcpy(ansy,y,sizeof(y));
}
}
}
else
{
if (!num[P[u].id])
{
cost+=P[u].v;
ge++;y[P[u].id]=true;
for (edge *e=V[P[u].id];e;e=e->next)
num[e->t]++;
if (i<=10000000) dfs(u+1);
for (edge *e=V[P[u].id];e;e=e->next)
num[e->t]--;
cost-=P[u].v;
ge--;y[P[u].id]=false;
}
if (i<=10000000) dfs(u+1);
}
}
int main()
{
freopen("fish.in","r",stdin);
freopen("fish.out","w",stdout);
init();
anscost=oo;
ansge=0;
dfs(1);
printf("%d %d\n",ansge,anscost);
for (int i=1;i<=n;i++)
{
if (ansy[i]) printf("%d\n",i);
}
return 0;
}