可以用完全背包来做,也可以用贪心的方法来做。
贪心的话:
(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;
}