UVa 10465 - Homer Simpson

来源:互联网 发布:海口seo 编辑:程序博客网 时间:2024/04/30 17:10

可以用完全背包来做,也可以用贪心的方法来做。

贪心的话:

(1)如果恰好可以凑成t,则更新最大汉堡数(即:A+B最大)。

(2)如果凑不成t,则在 t-max最小的情况下,更新A+B的最大值。


贪心法(0.024s):

#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>using namespace std;int _max;int main(){#ifdef test    freopen("input.txt", "r", stdin);#endif    int m[2], t;    while(scanf("%d%d%d", &m[0], &m[1], &t) != EOF)    {        int max1 = 0, max2 = 0, peer = 10000;        for(int i=0;; ++i)        {            int sum = t - i * m[0];            if(sum < 0)                break;            int num = sum / m[1];            int mod = sum % m[1];            if(!mod)            {                if(max1 < i+num)                    max1 = i + num;            }            else if(mod <= peer)            {                if(mod==peer && max2>i+num)                    continue;                max2 = i+num;                peer = mod;            }        }        if(max1 != 0)            printf("%d\n", max1);        else            printf("%d %d\n", max2, peer);    }    return 0;}

DP(0.184):

#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>using namespace std;int dp[10001];const int inf = 0x3FFFFFFF;int main(){#ifdef test    freopen("input.txt", "r", stdin);#endif    int m[2], t;    while(scanf("%d%d%d", &m[0], &m[1], &t) != EOF)    {        for(int i=1; i<=t; ++i)            dp[i] = -inf;        dp[0] = 0;        for(int i=0; i<2; ++i)            for(int j=m[i]; j<=t; ++j)            {                int t = dp[j-m[i]] + 1;                if(dp[j] < t)                    dp[j] = t;            }        for(int i=t; i>=0; --i)            if(dp[i] >= 0)            {                if(i == t)                    printf("%d\n", dp[i]);                else                    printf("%d %d\n", dp[i], t-i);                break;            }    }    return 0;}