背包问题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;
}
原文地址:https://www.cnblogs.com/AndreMouche/p/1954348.html