索道"/>
【迭代加深】索道
索道
题目描述
这天,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;
}
更多推荐
【迭代加深】索道
发布评论