BFS之二

//poj 1252 Euro Efficiency

//给出6枚不同面值(在1到100之间)的硬币,通过 加减 凑出1到100的钱数,我们关心的是最少要用到几枚硬币,
//最后求出平均值,并找出其中最大值

#include
<iostream> //BFS最短路搜索
#include<stdio.h>
#include
<algorithm>
#include
<queue>
#include
<cstring>
using namespace std;
int euro[20],f[200],vis[200];
int main()
{
int cases;
cin
>>cases;
while(cases--)
{
for(int i=1;i<=6;++i)
{
cin
>>euro[i];
euro[i
+6]=-euro[i];
}
memset(vis,
0,sizeof(vis));
queue
<int> col;
col.push(
0);
while(!col.empty())
{
int fro=col.front();
col.pop();
for(int i=1;i<=12;++i)
{
int u=fro+euro[i];
if(u>0&&u<200&&vis[u]==0) //因为允许减,所以一个数可以由超过100的数减另一个数得到。由于The last number is less than 100.考虑减去99的情况,故 u 的最大值取 199, 即 199-99=100
{
f[u]
=f[fro]+1; //最短路搜索,因为是宽搜,所以只要搜索到u,则f[u]肯定是组成币值u所需的最小货币数目
vis[u]=1;
col.push(u);
}
}
}
double ave=0;
for(int i=1;i<=100;++i)
ave
+=f[i];
printf(
"%.2f %d\n",ave/100,*max_element(f+1,f+101));
}
return 0;
}

  

posted on 2011-08-22 11:58  sysu_mjc  阅读(150)  评论(0编辑  收藏  举报

导航