http://poj.org/problem?id=1252

先计算6种钱币相加的情况,有f[j] = min(f[j], f[j-data[i]]+1) ;

然后计算找零的情况,有f[j] = min(f[j], f[j+data[i]]+1) ;

计算的上限要比100大,因为有找零的情况,但是要大多少不太好确定。

code:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std ;
const int Max = 2500 ;//..
int data[6], f[Max] ;
int main(){
    int t, n, i, j, sum, max ;
    scanf("%d", &t) ;
    while(t--){
        for(i=0; i<6; i++)
            scanf("%d", &data[i]) ;
        f[0] = 0 ;
        for(i=1; i<Max; i++)
            f[i] = 2000000 ;
        for(i=0; i<6; i++)      //相加
            for(j=data[i]; j<Max; j++)
                f[j] = min(f[j], f[j-data[i]]+1) ;
        for(i=0; i<6; i++)      //相减
            for(j=Max-data[i]; j>=1; j--)
                f[j] = min(f[j], f[j+data[i]]+1) ;
        sum = max = 0 ;
        for(i=1; i<=100; i++){
            sum += f[i] ;
            if(f[i]>max)    max = f[i] ;
        }
        printf("%.2lf %d\n", (double)sum/100, max) ;
    }
    return 0 ;} 
posted on 2012-04-14 08:37  追逐.  阅读(229)  评论(0编辑  收藏  举报