(纪中)2219. 水果盛宴(fruit)【深搜】

(File IO): input:fruit.in output:fruit.out
时间限制: 1000 ms 空间限制: 262144 KB 具体限制
Goto ProblemSet


题目描述
贝茜又再一次地闯入了 F a r m e r J o h n Farmer John FarmerJohn 的房子!她在厨房发现了一堆柠檬和一堆橘子(每堆都有无限多个),并且,她希望尽可能地多吃。
贝茜的有一个饱腹值上限 T ( 1 < = T < = 5 , 000 , 000 ) T(1<=T<=5,000,000) T(1<=T<=5,000,000)。吃一个橘子会增加她 A A A 点饱腹值,吃一个柠檬会增加她 B B B 点饱腹值 ( 1 < = A , B < = T ) (1<=A,B<=T) (1<=A,B<=T),如果她愿意,贝茜可以最多喝一次水,这会立即使她的饱腹值变成一半,请你帮助贝茜求出她可以获得的最大饱腹值。


输入
一行三个整数 T , A T,A T,A B B B

输出
一行一个整数,表示贝茜可获得的最大饱腹值


样例输入
8 5 6

样例输出
8


数据范围限制


解题思路
本题就是一道深搜题。搜索吃橘子、吃柠檬和喝水的饱腹值,就能 A A A了。从 0 0 0开始去递归它出现的所有情况,在里面找一个最大值,注意越界和重复情况即可。 详见代码。


代码

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<stdio.h>
#include<iomanip>
#include<cmath>
using namespace std;
int t,a,b,ans;
bool f[5000010],p;
void dfs(int s){
    f[s]=1;
    if(s+a<=t)
    {
        ans=max(ans,s+a);
        if(s+a==t)
        {
            printf("%d",t);
            exit(0);
        }
         if(f[s+a]==0) 
            dfs(s+a);
    }
    if(s+b<=t)
    {
        ans=max(ans,s+b);
        if(s+b==t)
        {
            printf("%d",t);
            exit(0);
        }
         if(f[s+b]==0) 
            dfs(s+b);
    }
    if (p==0&&f[s/2]==0)
    {
        p=1;
        dfs(s/2);
        p=0;
    }
}
int main(){
    freopen("fruit.in","r",stdin);
    freopen("fruit.out","w",stdout);
    scanf("%d%d%d",&t,&a,&b);
    if(t==a||t==b||t%a==0||t%b==0)
    {
        printf("%d",t);
        return 0;
    }
    dfs(0);
    printf("%d",ans);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值