记录编号 |
44675 |
评测结果 |
AAAAAAAA |
题目名称 |
王伯买鱼 |
最终得分 |
100 |
用户昵称 |
Truth.Cirno |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.060 s |
提交时间 |
2012-10-19 17:13:04 |
内存使用 |
3.15 MiB |
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <memory.h>
using namespace std;
struct bootype
{
bool boo[50];
}rec,maxrec,unanow,una[50];
int n,lim,maxget,maxcost[50],cost[50];
void swap(int& a,int& b)
{
int temp;
temp=a;
a=b;
b=temp;
}
void dfs(int deep,bool get,int getnum,int costnow)
{
if (n-deep+getnum<maxget)
return;
if (deep==n)
{
if (maxget<=getnum)
{
maxget=getnum;
if (maxcost[maxget]<costnow)
{
maxcost[maxget]=costnow;
maxrec=rec;
}
}
return;
}
if (!unanow.boo[deep+1])
if (costnow+cost[deep+1]<=lim)
{
bootype temp;
temp=unanow;
for (int i=1;i<=n;i++)
unanow.boo[i]=unanow.boo[i]|una[deep+1].boo[i];
rec.boo[deep+1]=true;
dfs(deep+1,1,getnum+1,costnow+cost[deep+1]);
rec.boo[deep+1]=false;
unanow=temp;
}
dfs(deep+1,0,getnum,costnow);
}
int main(void)
{
freopen("fish.in","r",stdin);
freopen("fish.out","w",stdout);
int i,temp,temp2;
scanf("%d%d",&lim,&n);
for (i=1;i<=n;i++)
{
scanf("%d%d",&temp,&temp2);
cost[temp]=temp2;
}
while (scanf("%d%d",&temp,&temp2)==2)
{
una[temp].boo[temp2]=true;
una[temp2].boo[temp]=true;
}
if (cost[1]<=lim)
{
for (i=1;i<=n;i++)
unanow.boo[i]=unanow.boo[i]|una[1].boo[i];
rec.boo[1]=true;
dfs(1,1,1,cost[1]);
rec.boo[1]=false;
memset(unanow.boo,0,sizeof(unanow.boo));
}
dfs(1,0,0,0);
printf("%d %d\n",maxget,maxcost[maxget]);
for (i=1;i<=n;i++)
if (maxrec.boo[i])
printf("%d\n",i);
return(0);
}