/**
* 这题第一思路就是贪心,还是因为dp题做的少。 这题也是很明显的完全背包问题
* 不过对于这题贪心的效率更高吧。
* 思路: 令 m > n , 枚举n的个数的所有可能 0 到 sizeOfN。
* 因为这样枚举的话,能够使得先得到的一定比后得到的所选取的个数大。
* 然后用一个数组remain[10001]存drink beer的时间的各种情况所能够吃的最多的汉堡数。
* 最后输出的时候就是按i = 0 - t遍历remain[i].
*/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <stack>
#include <string>
#include <queue>
#include <map>
#include <algorithm>
#define INF 0x7fffffff
using namespace std;
int n, m, t, remain[10001];
int ans, minRe;
void solve() {
int cur, sizeOfN = t / n;
memset(remain, 0, sizeof(remain));
minRe = INF;
for(int i = 0; i <= sizeOfN; i ++) {
cur = t - i * n;
if(cur % m < minRe) {
minRe = cur % m;
if(cur / m + i > remain[minRe])
remain[minRe] = cur / m + i;
if(remain[0]) break;
}
}
if(remain[0]) {
printf("%d\n", remain[0]);
return ;
}
for(int i = 1; i <= 10000; i ++) {
if(remain[i]) {
printf("%d %d\n", remain[i], i);
return ;
}
}
printf("0 %d\n", t);
}
int main()
{
while(scanf("%d%d%d", &m, &n, &t) != EOF) {
if(m > n) swap(m, n);
ans = 0;
solve();
}
return 0;
}
dp:
直接贴人代码吧: - -
# include <stdio.h>
# include <memory.h>
# define MAX(x,y) ((x)>(y) ? (x):(y))
# define INF (1<<30)
int c[2];
int f[10001];
int main()
{
int t, i, v;
while (~scanf("%d%d%d", &c[0], &c[1], &t))
{
f[0] = 0;
for (i = 1; i <= 10000; ++i) f[i] = -INF;
for ( i = 0; i <= 1; ++i)
for ( v = c[i]; v <= t; ++v)
f[v] = MAX(f[v], f[v-c[i]]+1);
v = t;
while ( f[v] < 0) --v;
printf("%d", f[v]);
if (v != t) printf(" %d", t-v);
putchar('\n');
}
return 0;
}