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; }