• 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;
    }
    
  • 相关阅读:
    SpringRMI解析3-RmiServiceExporter逻辑细节
    SpringRMI解析2-RmiServiceExporter逻辑脉络
    SpringRMI解析1-使用示例
    SpringMVC解析5-DispatcherServlet逻辑细节
    SpringMVC解析4-DispatcherServlet逻辑脉络
    SpringMVC解析3-DispatcherServlet组件初始化
    SpringMVC解析2-ContextLoaderListener
    算法笔记_074:子集和问题(Java)
    算法笔记_073:哈密顿回路问题(Java)
    算法笔记_072:N皇后问题(Java)
  • 原文地址:https://www.cnblogs.com/Poetic-Rain/p/13068142.html
Copyright © 2020-2023  润新知