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