zoukankan      html  css  js  c++  java
  • P4817 Fruit Feast G

    最开始拿到这道题的时候,题目中其实只规定了两种水果的饱食度,可以理解成价值或是重量,在不超过T的情况求最大值。第一眼看过去感觉就是装箱问题(背包),只不过这道题用的是完全背包,但是考虑到喝水的情况,做背包的时候,反正没做过这种题,但是我们可以把它转移为搜索的做法,有一种01背包的思路

    每一次搜索,把吃橙子和柠檬的情况都处理一次,又因为只能喝一次水,我们只需要用bool类型的判断一下就好了,记住处理越界的情况

    #include<bits/stdc++.h>
    using namespace std;
    int a,b,t;
    int ans[10005];
    int m;
    void dfs(int v,int hs) {
    	if(v>t) return ;
    	if(v==t) {
    		ans[++m]=t;
    		if(m!=1) return ;
    	}
    	if(v>ans[1]) ans[1]=v;
    	if(hs==1) {
    		dfs(v/2,0);
    	}
    	dfs(v+a,hs);
    	dfs(v+b,hs);
    }
    int main() {
    	cin>>t>>a>>b;
    	dfs(0,1);
    	cout<<ans[1];
    	return 0;
    }
    

    但是这个程序只能得76分,因为TLE了,就是这道题的瓶颈。因为在深搜的时候,就会处理所有可能的答案和情况,导致超时,又因为是调用函数,不容易中途退出,所以在写的时候应该换一种思路

    我们用一个数组来存储搜到的答案,搜到的第一个答案就是正解,对于其他所有的情况,想都不要想直接return,节省多出来的时空间。除了这一种做法,还有一个比较简单的,可能是我对电脑程序运行不太了解的原因,可以直接使用exit(0),强制退出程序

    #include<bits/stdc++.h>
    using namespace std;
    int a,b,t;
    int ans[1000005];
    int m;
    void dfs(int v,int hs) {
    	if(m>1) return ;
    	if(v>t) return ;
    	if(v==t) {
    		ans[++m]=t;
    		if(m!=1) return ;
    	}
    	if(v>ans[1]) ans[1]=v;
    	if(hs==1) {
    		dfs(v/2,0);
    	}
    	dfs(v+a,hs);
    	dfs(v+b,hs);
    }
    int main() {
    	cin>>t>>a>>b;
    	dfs(0,1);
    	cout<<ans[1];
    	return 0;
    }
    
  • 相关阅读:
    MySQL SQL语句总结
    JavaFx通用查询、跳转创建、修改页面、关闭舞台工具类
    反射工具类
    SpringBoot将数据写入word模板,生成word文档
    vscode设置中文的方法
    Flex 布局
    处理程序“ExtensionlessUrlHandler-Integrated-4.0”在其模块列表中有一个错误模块“ManagedPipelineHandler” •使用了托管的处理程序,但是未安装或未完整安装 ASP.NET。
    第一周助教总结
    JS时间转换
    ES 安装常见错误
  • 原文地址:https://www.cnblogs.com/Poetic-Rain/p/13068142.html
Copyright © 2011-2022 走看看