完全背包之四

//poj 1252 Euro Efficiency

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

#include
<iostream> //完全背包 参考 poj9 3260 The Fewest Coins
#include<stdio.h>
#include
<algorithm>
using namespace std;
int main()
{
int cases,euro[10],dp[20000],maxn;
cin
>>cases;
while(cases--)
{
for(int i=1;i<=6;++i)
cin
>>euro[i];
maxn
=euro[5]*euro[5]+100; //上界
fill(dp,dp+maxn,-1);
dp[
0]=0;
for(int i=1;i<=6;++i) // 加运算
{
for(int j=euro[i];j<=maxn;++j)
if(dp[j-euro[i]]!=-1)
{
if(dp[j]==-1)
dp[j]
=dp[j-euro[i]]+1;
else
dp[j]
=min(dp[j],dp[j-euro[i]]+1);
}
}
for(int i=1;i<=6;++i) // 减运算
{
for(int j=maxn-euro[i];j>0;--j) //因为是减,所以要逆序循环
if(dp[j+euro[i]]!=-1)
{
if(dp[j]==-1)
dp[j]
=dp[j+euro[i]]+1;
else
dp[j]
=min(dp[j],dp[j+euro[i]]+1);
}
}
double ave=0;
for(int i=1;i<=100;++i)
ave
+=dp[i];
printf(
"%.2f %d\n",ave/100,*max_element(dp+1,dp+101));
}
return 0;
}

  

posted on 2011-08-23 17:13  sysu_mjc  阅读(116)  评论(0编辑  收藏  举报

导航