背包问题--POJ 1252 Euro Efficiency【完全背包】
POJ 1252 Euro Efficiency
大意:六种货币,面值都小于100。用这六种货币(可加可减)
用最少的货币数组成1到100。求出这1到100中最大的,并求平均值。
两个完全背包即可,一个付钱,一个找钱
#include<stdio.h>
#include<string.h>
const int N = 10000+100+2;
int dp[N];
int a[6];
int min(int a,int b)
{
if(a==-1)return b;
return a<b?a:b;
}
int main()
{
int T;
while(scanf("%d",&T)!=EOF)
{
while(T--){
int i,j;
int upper = 0;
for(i=0;i<6;i++)
{
scanf("%d",&a[i]);
if(upper<a[i])
upper=a[i];
}
upper= upper*upper+100+1;
memset(dp,-1,sizeof(dp));
dp[0]=0;
for(i=0;i<6;i++) //付钱
{
for(j=a[i];j<upper;j++)
{
if(dp[j-a[i]]!=-1)
dp[j]=min(dp[j],dp[j-a[i]]+1);
}
}
for(i=0;i<6;i++)//找钱
{
for(j=upper-1-a[i];j>=0;j--)
if(dp[a[i]+1]!=-1)
dp[j]=min(dp[j],dp[j+a[i]]+1);
}
__int64 ans = 0;
__int64 bigger = dp[1];
for(i=1;i<=100;i++)
{
ans+=dp[i];
if(dp[i]>bigger)bigger=dp[i];
}
printf("%.2lf %d\n",ans/100.0,bigger);
}
}
return 0;
}

浙公网安备 33010602011771号