poj 1252 Euro Efficiency

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

题意:给出六种钱币(面值都在1-100)求出组合成1-100的最少步数和(这里可以减);

思路:完全背包;

代码:

View Code
#include <cstdio>

#include <algorithm>

#include <iostream>

#include <cstring>

#include <cstdlib>

using namespace std;

#define mm 9999999

int dp1[2100]; //这里刚开始开到200,会WA,要开大一点

int a[7];

double ans = 0;

int ma = 0;

int main()

{

    int w = 0;

    scanf("%d",&w);

    while(w--)

    {

        ma = 0;

        ans = 0;

        for(int i = 1;i <= 6; ++i)

        scanf("%d",&a[i]);

            fill_n(dp1,2005,mm);

            dp1[0] = 0;

        for(int i = 6;i >= 1; --i)

        for(int t = a[i];t <= 2000;++t)

        if(dp1[t] > dp1[t-a[i]]+1)

        dp1[t] = dp1[t-a[i]]+1;

        for(int i = 1;i <= 100; ++i)

        {

            int temp = mm;

        for(int j = 0;j <= 1900; ++j)

        if(temp > dp1[j+i] + dp1[j])

        temp = dp1[j+i] + dp1[j];

        if(temp > ma)

        ma = temp;

        ans = ans + temp;

        }

        printf("%.2f %d\n",ans/100,ma);

    }

}

你可能感兴趣的:(poj)