欲望以提升热忱,毅力以磨平高山!|

XichenOC

园龄:1个月粉丝:4关注:0

📂题解
🔖搜索
2025-01-20 18:54阅读: 7评论: 0推荐: 0

P10483 小猫爬山

P10483 小猫爬山

背景

这是一道 \(DFS\) 是个人就能看出来
而我第一种方法没有过( 哭死 )结果把\(DFS\)的对象改一下就过了
本题与 U208362 分为互质组 方法相同

分析题目

题目要求就是最少需要多少缆车才能装完所有小猫,因此小猫的重量可以少于缆车的载重,但不能大于(意思就是不能把小猫劈开!猫猫这么可爱,这么能劈开呢?)

思路&实现

这道题我们用 \(DFS\) 来遍历每一只小猫的重量:

\(dfs(st,num)\)
\(st\)是指当前遍历到第几个小猫
\(num\)是指当前缆车的总数

每到一只新的小猫,就会面临两个选择:

  1. 把小猫放到一个全新得缆车中,并将缆车的个数加一,且进行下一轮 \(DFS\)
  2. 不选择放入新的缆车,而是在前面已有的缆车中找可以放下的,将他加入,并进行下一轮 \(DFS\)

因此我们需要一个\(sum[i]\)来储存第 \(i\) 辆缆车剩余的容量

结束:

1.当当前遍历的 \(st==n+1\) 及遍历完所有小猫,就可以将 \(ans=num\) 并返回
2.若你当前的缆车数量已经超过之前的答案及 \(num>=ans\) 那就直接返回

最后直接上代码:

#include<bits/stdc++.h>
using namespace std;
int a[20],sum[20];
int n,w;
bool b[20];
int ans=2e9;
void dfs(int st,int num){
	if (num>=ans)
		return;
	if(st==n+1){
		ans=num;
		return;
	}
	sum[num+1]=w-a[st];
	dfs(st+1,num+1); 
	for(int i=1;i<=num;i++) {
		if (sum[i]-a[st]>=0) {
			sum[i]-=a[st];
			dfs(st+1,num);
			sum[i]+=a[st];
		}
	}
}
bool cmp(int x,int y){
	return x>y;
}
int main(){
	cin>>n>>w;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}	
	sort(a+1,a+1+n,cmp);
	dfs(1,0);
	cout<<ans;
	return 0;
}

本文作者:XichenOC

本文链接:https://www.cnblogs.com/XichenOC/p/18682327

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   XichenOC  阅读(7)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起