洛谷 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
",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/
新的风暴已经出现 怎么能够停止不前 穿越时空 竭尽全力 我会来到你身边 微笑面对危险 梦想成真不会遥远 鼓起勇气 坚定向前 奇迹一定会出现

 
原文地址:https://www.cnblogs.com/whistle13326/p/7470671.html