【迭代加深】索道

编程入门 行业动态 更新时间:2024-10-21 18:38:52

【迭代加深】<a href=https://www.elefans.com/category/jswz/34/1755901.html style=索道"/>

【迭代加深】索道

                                            索道

题目描述

这天,Tom带一群小朋友们去爬山。经历了千辛万苦,小朋友们终于爬上了山顶,但是疲倦的他们再也不想徒步走下山了。

Tom只好花钱让它们坐索道下山。索道上的缆车最大承重量为W,而N个小朋友的重量分别是C1、C2……CN。当然,每辆缆车上的小朋友的重量之和不能超过W。

每租用一辆缆车,Tom就要付1美元,所以他想知道,最少需要付多少美元才能把这N个小朋友都运送下山?(不包括Tom)

输入格式:

第一行包含两个用空格隔开的整数,N和W。

接下来N行每行一个整数,其中第i+1行的整数表示第i个小朋友的重量Ci。

输出格式:

输出一个整数,最少需要多少美元,也就是最少需要多少辆缆车。

输入样例:

5 1996
1
2
1994
12
29

输出样例:

2

【数据范围】

对于100%的数据,1≤N≤18;1≤Ci≤W≤10^8。

 

解析:

       迭代加深搜索。最好按照从大到小排序优化搜索顺序。

 

代码:

#include <bits/stdc++.h>
using namespace std;const int Max=20;
int n,m,ans,sum,flag;
int num[Max],Sum[Max];inline bool comp(const int &a,const int &b){return a>b;}inline void dfs(int pos,int limit)
{if(pos==n+1) {flag=1;return;}for(int i=1;i<=limit;i++){if(Sum[i]+num[pos]>m) continue;Sum[i]+=num[pos];dfs(pos+1,limit);Sum[i]-=num[pos];if(flag) return;}
}int main()
{cin>>n>>m;for(int i=1;i<=n;i++) cin>>num[i],sum+=num[i];sort(num+1,num+n+1,comp);for(int i=sum/m;i<=n;i++){dfs(1,i);if(flag) {cout<<i<<"\n";break;}}return 0;
}

 

更多推荐

【迭代加深】索道

本文发布于:2024-02-07 08:43:57,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1755380.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:索道   迭代

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!