洛谷 P1361 小猫爬山
P1361 小猫爬山
题目描述
WD和LHX饲养了N只小猫,这天,小猫们要去爬山。经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了。
WD和LHX只好花钱让它们坐索道下山。索道上的缆车最大承重量为W,而N只小猫的重量分别是C1、C2……CN。当然,每辆缆车上的小猫的重量之和不能超过W。每租用一辆缆车,WD和LHX就要付1美元,所以他们想知道,最少需要付多少美元才能把这N只小猫都运送下山?
输入输出格式
输入格式:
第一行包含两个用空格隔开的整数,N和W。
接下来N行每行一个整数,其中第i+1行的整数表示第i只小猫的重量C i。
输出格式:
输出一个整数,最少需要多少美元,也就是最少需要多少辆缆车。
输入输出样例
输入样例#1:
5 1996 1 2 1994 12 29
输出样例#1:
2
说明
数据范围与约定
对于100%的数据,1<=N<=18,1<=C i <=W<=10^8。
虽然看上去像贪心
但却是迭代加深
1 /* 2 巧妙地迭代加深 3 把猫往车厢里塞复杂度太高 4 我们就向车厢塞猫 5 先遍历车厢数 6 再递归塞猫 看猫能进哪个车厢 7 */ 8 #include <cctype> 9 #include <cstdio> 10 11 const int MAXN=20; 12 13 int n,we; 14 15 int a[MAXN],v[MAXN]; 16 17 inline void read(int&x) { 18 int f=1;register char c=getchar(); 19 for(x=0;!isdigit(c);c=='-'&&(f=-1),c=getchar()); 20 for(;isdigit(c);x=x*10+c-48,c=getchar()); 21 x=x*f; 22 } 23 24 bool dfs(int u,int num) { 25 for(int i=1;i<=u&&i<=num;++i) { 26 if(v[i]+a[u]<=we) { 27 v[i]+=a[u]; 28 if(u==n) return true; 29 if(dfs(u+1,num)) return true; 30 v[i]-=a[u]; 31 } 32 } 33 return false; 34 } 35 36 int hh() { 37 read(n);read(we); 38 for(int i=1;i<=n;++i) read(a[i]); 39 for(int i=1;i<=n;++i) { 40 for(int j=1;j<=n;++j) v[j]=0; 41 if(dfs(1,i)) { 42 printf("%d\n",i); 43 break; 44 } 45 } 46 return 0; 47 } 48 49 int sb=hh(); 50 int main(int argc,char**argv) {;}
作者:乌鸦坐飞机
出处:http://www.cnblogs.com/whistle13326/
新的风暴已经出现
怎么能够停止不前
穿越时空 竭尽全力
我会来到你身边
微笑面对危险
梦想成真不会遥远
鼓起勇气 坚定向前
奇迹一定会出现