算法竞赛指南dfs——小猫爬山

原题链接

165. 小猫爬山 - AcWing题库icon-default.png?t=M1L8https://www.acwing.com/problem/content/167/代码:

#include<iostream>
#include<algorithm>
using namespace std;

int cat[20];
int cab[20];
int ans = 0;
int n,w;

void dfs(int now,int cnt)//当前第now只小猫,已经租用了cnt辆缆车 
{
	if(cnt>ans)return ; //剪枝 
	if(now>n){	        //边界条件 
		ans = min(ans,cnt);
		return ;
	}
	for(int i =1;i<=cnt;i++){//看看已经租用的缆车有没有空位,有就装 
		if(cab[i]+cat[now]<=w){
			cab[i]+=cat[now];
			dfs(now+1,cnt);
			cab[i] -= cat[now];
		}
	}
	//已经租用的缆车已经没有空位了,再租一辆
	cab[cnt+1] += cat[now];
	dfs(now+1,cnt+1);
	cab[cnt+1] = 0; 
}
int main()
{
	cin>>n>>w;
	for(int i =1;i<=n;i++) cin>>cat[i];
	sort(cat+1,cat+n+1);reverse(cat+1,cat+n+1);
	ans = n;
	
	dfs(1,0);
	cout<<ans;	
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值