zoukankan      html  css  js  c++  java
  • 算法进阶指南(DFS和BFS)--- 小猫爬山

    题目链接:小猫爬山

    解法一:

    #include<iostream>
    #include<algorithm>
    
    using namespace std;
    
    const int N = 20;
    int n,m;
    int cat[N],sum[N];
    int ans=N;
    
    void dfs(int now,int cnt) {
    	if(cnt>=ans) return ; //剪枝 
    	if(now == n+1) {
    		ans = min(ans,cnt);
    		return ;
    	}
    	//枚举当前所有车 
    	for(int i=1; i<=cnt; i++) {
    		if(cat[now] + sum[i] <= m) {
    			sum[i]+=cat[now];
    			dfs(now+1,cnt);
    			sum[i]-=cat[now];//还原 
    		}
    	}
    	sum[cnt+1]=cat[now];//把猫放入新车 
    	dfs(now+1,cnt+1);
    	sum[cnt+1]=0;//回溯 
    }
    int main() {
    	cin >> n >>m;
    	for(int i=1; i<=n; i++) cin>>cat[i];
    	sort(cat+1,cat+n+1);
    	reverse(cat+1,cat+n+1);
    	dfs(1,0);
    	cout<<ans<<endl;
    	return 0;
    }
    

    解法二:

    #include<iostream>
    #include<algorithm>
    
    using namespace std;
    
    const int N = 20;
    int n,m;
    int cat[N],sum[N];
    int ans=N;
    
    void dfs(int u,int k) {
    	if(k>=ans) return ;
    	if(u == n) {
    		ans = k;
    		return ;
    	}
    	for(int i=0; i<k; i++) {
    		if(sum[i]+cat[u]<=m) {
    			sum[i]+=cat[u];
    			dfs(u+1,k);
    			sum[i]-=cat[u];
    		}
    	}
    	sum[k]=cat[u];
    	dfs(u+1,k+1);
    	sum[k]=0;
    }
    int main() {
    	cin >> n >>m;
    	for(int i=0; i<n; i++) cin>>cat[i];
    	sort(cat,cat+n);
    	reverse(cat,cat+n);
    	dfs(0,0);
    	cout<<ans<<endl;
    	return 0;
    }
    
  • 相关阅读:
    将Excel文件.xls导入SQL Server 2005
    linux mount命令
    python write file
    vim visual模式 复制
    chef简介
    录音整理文字工具otranscribe简介
    ftp put get 的使用方法
    yum lock 解决方法
    phalcon builder get raw sql
    centos7安装VirtualBox
  • 原文地址:https://www.cnblogs.com/bingers/p/13193949.html
Copyright © 2011-2022 走看看