贪吃的小J

https://www.luogu.com.cn/problem/P4817 

# Description

现在小J的胃的容量为0,她每吃一个orange,容量就会增加A;每吃一个lemon,饱食度就会增加B。小J还有一次喝水的机会,如果小J喝水前饱食度为x,喝水后饱食度会变为trunc(x/2)

小J的胃的容量不能超过T,否则肚子会爆炸。
试求小J的胃的容量最大能达到多少。

# Format

## Input
一行给出三个数字T,A,B
1<=T<=5,000,000
1<=A,B<=T

## Output
如题
# Samples

```input1
8 5 6
```

```output1

```

//76分 
#include <iostream>
using namespace std;

int t, a, b;
int ans;

inline int maxa(int a, int b) {
	if (a > b)
		return a;
	return b;
}

void dfs(int food, bool flag) {
	ans = maxa(ans, food);
	if (t >= food + a)
		dfs(food + a, flag);
	if (t >= food + b)
		dfs(food + b, flag);
	if (! flag)
		dfs(food >> 1, flag ^ 1);
	return ;
}

int main() {
	cin >> t >> a >> b;
	dfs(0, 0);
	cout << ans << endl;
	return 0;
} 



//ac
#include <iostream>

using namespace std;

const int T = 5e6 + 7;

int t, a, b;
int ans;
int mem[T];

inline int maxa(int a, int b) {
	if (a > b)
		return a;
	return b;
}

void dfs(int food, bool flag) {
	if (mem[food])
		return ;
	mem[food] = 1;//就是这步!!
	if (food > t)
		return ;
	ans = maxa(ans, food);
	dfs(food + a, flag);
	dfs(food + b, flag);
	if (! flag)
		dfs(food >> 1, flag ^ 1);
	return ;
}

int main() {
	cin >> t >> a >> b;
	dfs(0, 0);
	cout << ans << endl;
	return 0;
} 

  

原文地址:https://www.cnblogs.com/cutemush/p/15317681.html